Developing Projects with Ape
Use ape init
to create your project.
A common project structure looks like this:
project # The root project directory
├── contracts/ # Project source files, such as '.sol' or '.vy' files
│ └── smart_contract_example.sol # Sample of a smart contract
├── tests/ # Project tests, ran using the 'ape test' command
│ └── test_sample.py # Sample of a test to run against your sample contract
├── scripts/ # Project scripts, such as deploy scripts, ran using the 'ape run <`name>' command
│ └── deploy.py # Sample script to automate a deployment of an ape project
└── ape-config.yaml # The ape project configuration file
Notice that you can configure you ape project using the ape-config.yaml
file.
See the configuration guide for a more detailed explanation of settings you can adjust.
The Local Project
After you have a local project and you are in the directory of that project, the global project
reference in Ape will refer to this project.
You can see this by typing project
in the ape console
:
In [1]: project
Out[1]: <ProjectManager ~/ApeProjects/ape-demo-project>
In this case, my terminal’s current working directory is the same as a local project named ape-demo-project
.
Other Projects
You can reference other local projects on your computer by using the Project
factory class (notice the capital P
):
from ape import Project
my_other_project = Project("../path/to/my/other/project")
_ = my_other_project.MyContract # Do anything you can do to the root-level project.
Project Manifests
Ape stores and caches artifacts in an EthPM package manifest.
When working with local projects, the manifests get placed in the <project-path>/.build/__local__.json
.
However, you may obtain a manifest from a different location.
If that is the case, you can create a project directly from the manifest itself:
from ape import Project
# Pass in a manifest (object or dictionary), or a path to a manifest's JSON file.
project = Project.from_manifest("path/to/manifest.json")
_ = project.MyContract # Do anything you can do to the root-level project.
Installed Python Projects
If you have installed a project using pip
or alike and you wish to reference its project, use the Project.from_python_library()
class method.
from ape import Project
snekmate = Project.from_python_library("snekmate", config_override={"contracts_folder": "."})
Dependencies
Use other projects as dependencies in Ape. There is an extensive guide you can read on this here. But it is important to note that the dependency system largely is dependent on the project system. Dependencies are just projects after all; projects containing source files you both use in your projects or compile independently.
For example, access a dependency project and treat it like any other project this way:
from ape import project
dependency = project.dependencies.get_dependency("my-dependency", "1.0.0")
contract_type = dependency.project.ContractFromDependency