编译合约

 合约位置(存储合约的根目录)

所有合约必须存放在 contracts/ 路径下. 由于合约使用 Solidity 语言编写, 所有合约均必须以 .sol 为扩展名. 其中引用的 Solidity 库 也要是以 .sol 为扩展名的.

If you're using a Truffle Box, you will have multiple files here.

默认 Truffle 项目 (使用 truffle init 创建的空项目), 会有一个 Migrations.sol 文件, 用于协助部署过程. 如果是使用 Truffle Box模板 那么将会有多个初始化的 .sol 文件在 contracts/ 目录下.

 命令行

编译 Truffle 项目之前, 先进入项目的文件夹内, 使用如下命令:

truffle compile

首次运行的时候, 所有合约将依次被编译. 之后的运行, 只会编译自上次成功编译后作出修改的合约. 如果想要在之后仍然全部编译, 给上面的命令加一个 --all 参数.

 编译工件

编译将生成对应的工件文件存储在相对于该项目的根路径的 build/contracts/ 文件夹中. (文件夹不存在将自动创建).

这些工件是 Truffle 进行后面工作的核心, 在后续部署应用的时候也非常有用. 该文件无需手动编辑, 重新执行编译命令会覆盖原文件.

 依赖

你可以使用 Solidity 的 import 语句来声明合约依赖, Truffle 将会根据依赖关系自动编译依赖内容, 保证所有的依赖均被编译器编译. 可以使用下面两种方法来指定依赖:

 使用文件名导入依赖

从单独文件导入合约, 将下面的代码加入到 Solidity 源码之中:

import "./AnotherContract.sol";

这就引入了所有在 AnotherContract.sol 文件内的合约. AnotherContract.sol 对应的是当前引入文件相对路径.

注意: Solidity 允许其他导入语法. 参考 Solidity import documentation 了解详细内容.

 使用外部包中的依赖合约

Truffle 支持通过 EthPM 或者 NPM 安装的依赖合约, 导入依赖包中的合约, 使用下面的语法:

import "somepackage/SomeContract.sol";

somepackage 代表使用 EthPM 或 NPM 安装的包, SomeContract.sol 代表该包提供的 Solidity 源码文件.

注意: Truffle 将会 首先使用 EthPM 搜索对应的包, 找不到的再使用 NPM 自动安装. 所以要注意两个仓库的命名冲突.

更多关于 Truffle 包管理内容, 参考 EthPMNPM 文档.