Foundry 创建新项目
本章介绍如何创建一个新的 Foundry
项目。
我们演示如何创建一个 Foundry
新项目,并对项目进行编译和测试。
新建项目
新建一个 Foundry
新项目,需要使用 forge init 命令:
$ forge init hello
让我们看看 forge
为我们生成的内容:
$ cd hello $ tree . -d -L 1 . ├── lib ├── script ├── src └── test 4 directories
这是使用 forge
命令初始化一个新的项目,最终形成的项目结构。
各个目录的用途:
lib
:用于存放项目依赖的库。如果你的项目依赖于外部智能合约或库(比如 OpenZeppelin 的合约),它们将会被安装在这个目录下。script
:包含用于与智能合约交互的脚本。这些脚本可以用来部署合约、执行交易或者调用合约的函数。src
:存放项目的Solidity
源代码文件。我们编写和测试的智能合约代码位于这个目录。test
:包含项目的测试文件。我们使用Foundry
编写和执行针对智能合约的测试,以验证合约功能的正确性。
这个结构旨在帮助开发者组织和管理智能合约项目,使得代码更加模块化,便于管理和协作。
通过将合约代码、测试和脚本分别放在不同的目录中,开发者可以更容易地维护项目,并使用 forge
提供的命令高效地进行编译、测试和部署等操作。
新项目的 src 目录下生成了一个例子合约 Counter.sol。我们实际项目中,通常会删除这个例子合约,并把我们开发的合约放入 src 目录下。
新项目的 test 目录下生成了一个测试合约 Counter.t.sol。我们实际项目中,通常会删除这个测试合约,并编写自己的测试合约。
编译合约
我们可以使用 forge compile 编译合约:
$ forge compile Compiling 10 files with 0.8.16 Solc 0.8.16 finished in 3.97s Compiler run successful
执行 forge compile 命令,会对 src 目录下的合约进行编译。如果合约有错误就会提示错误信息,当我们修改完合约后,可以再次执行该命令,直至通过编译。
另外,有些 Foundry
版本会有 forge build 命令,它与 forge compile 功能基本相同,我们不再单独解释。
测试合约
我们可以使用 forge test 运行测试:
$ forge test No files changed, compilation skipped Running 2 tests for test/Counter.t.sol:CounterTest [PASS] testIncrement() (gas: 28312) [PASS] testSetNumber(uint256) (runs: 256, μ: 27376, ~: 28387) Test result: ok. 2 passed; 0 failed; finished in 24.43ms
执行 forge test 命令,就会使用 test 目录下的测试合约进行测试,并输出测试结果。
我们依据测试结果,修改合约的错误后,可以再次执行该命令,直至通过测试。
使用模板创建项目
如果我们想使用不同的模板创建一个新项目,可以通过指令参数 --template,如下所示:
$ forge init --template https://github.com/foundry-rs/forge-template hello_template
通过指定模板的方式,可以创建一个跟模板相同的新项目。
例子中的模板是一个空 Foundry
项目,里面的合约是一个空合约,测试脚本也是一个空脚本。
缓存文件
我们使用 forge 命令编译或者测试合约时,会产生了两个新目录:out
和 cache
。
这两个目录中是为了缓存编译和测试结果,用来提高运行效率。
out
目录包含了合约工件,例如 ABI; cache
用来作为缓存编译结果,以便仅仅去重新编译那些需要编译的内容。