Truffle 配置¶
配置文件位置¶
配置文件名为 truffle-config.js
,位于项目目录的根目录下。 它是Javascript文件,可以执行创建配置所需的任何代码。 它必须导出表示项目配置的对象,如下例所示:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // 匹配任何网络
}
}
};
默认配置附带开发网络的配置,运行在 127.0.0.1:8545
上。 还有许多其他配置选项,详情如下。
解决 Windows 命令名冲突¶
警告
仅适用于Truffle 4 及以下版本。
在Windows上使用命令提示符时,默认配置文件名可能会导致与 truffle
可执行文件冲突,因此我们可能无法在现有项目上正确运行Truffle命令。
这是因为命令优先级在命令提示符上的工作方式。 truffle.cmd
可执行文件作为 npm 包的路径上,但 truffle.js
配置文件位于运行 truffle
命令的实际目录中。 而 .js
是默认的可接受的可执行扩展名,truffle.js
优先于 truffle.cmd
,导致意外的结果。
以下任何解决方案都可以解决此问题:
使用
.cmd
扩展名(truffle.cmd compile
)显式调用可执行文件。编辑系统
PATHEXT
环境变量并从可执行扩展列表中删除.JS;
。将
truffle.js
重命名为其他东西(truffle-config.js
)。使用 Windows PowerShell 或 Git BASH, 或不会引起冲突的 shell .
常用配置选项¶
网络 networks¶
指定部署网络,以及与每个网络交互时的特定交易参数(例如,gas价格,账号地址等)。 在指定网络上进行编译和部署时,将保存并记录合约工件(artifacts)以供以后使用。
当合约抽象检测到我们的以太坊客户端连接到指定网络时,他们将使用与该网络相关联的合约工件(artifacts)来简化应用程序部署。 网络是通过以太坊的 net_version
RPC调用以及区块链URI来识别。
如下所示,networks
对象由网络名称作为键,并包含定义相应网络参数的对象。
networks
选项是必须项,如果没有网络配置,Truffle将无法部署我们的合约。 truffle init
提供的默认网络配置为我们提供了一个与其连接相匹配的开发网络 - 开发过程中非常有用,但不适合生产部署。
要将Truffle配置连接到其他网络,就需添加更多命名网络(named networks)并指定相应的网络ID。
网络名称可用于提示用户,例如它特定网络上运行迁移:
$ truffle migrate --network live
如:
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*", // 匹配任何网络
websockets: true
},
live: {
host: "178.25.19.88", // 用于示例目的的随机IP(不要使用)
port: 80,
network_id: 1, // 以太坊主网
// 可选配置:
// gas
// gasPrice
// from - Truffle 在进行交易是的默认发送地址
// provider - Truffle 用来连接以太坊网络的 web3 provider 实例
// - 如果是一个函数,需要返回 web3 provider 实例 (参考下文)
// - 如果指定了provider, host 和 port 或忽略。
// skipDryRun: - 如果不想在实际迁移之前在本地测试运行迁移,则为true(默认为false)
// timeoutBlocks: - 如果没有交易没有挖出,保持等待的区块数(默认为50)
}
}
不管哪个网络,如果未指定交易选项,则将使用以下默认值:
gas
: 指定部署的 gas limit。 默认为4712388
。gasPrice
: 指定部署的 gas价格。 默认为100000000000
(100香农)。from
: 部署时使用的账号地址。 默认为我们的以太坊客户端提供的第一个可用帐户。provider
: 默认web3提供者使用host
和port
指定,如new Web3.providers.HttpProvider("http://<host>:<port>")
websockets
: 我们需要启用此功能才能使用confirmmations
监听器或使用.on
或.once
监听事件。 默认为false
。
对于每个网络,我们可以指定 host
/ port
或 provider
,但不能同时指定两者。 如果我们需要 HTTP 提供者(Provider),我们建议使用 host
和 port
,而如果我们需要自定义提供者(Provider),如HDWalletProvider
,则必须使用 provider
。
提供者 Providers¶
以下网络列表由本地测试网络和 Infura 托管的 Ropsten 网络组成,两者均由 HDWalletProvider 提供。 确保在函数闭包中包装(wrap) truffle-hdwallet
提供者(Provider),如下所示,以确保一次只连接一个网络。
networks: {
ropsten: {
provider: function() {
return new HDWalletProvider(mnemonic, "https://ropsten.infura.io/v3/YOUR-PROJECT-ID");
},
network_id: '3',
},
test: {
provider: function() {
return new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/");
},
network_id: '*',
},
}
如果指定 host
和 port
而不是 provider
,Truffle将使用该主机和端口创建自己的默认 HTTP 提供者(Provider),在这种情况下,我们将无法使用自定义提供者(Provider)。
指定合约目录¶
默认(未编译合约)目录的是位于项目根目录的 ./contacts
。 如果我们希望将合约保存在不同的目录中,则可以指定 contracts_directory
属性。
例如,让Truffle在编译时在 ./allMyStuff/someStuff/theContractFolder
(递归)文件中查找合约:
module.exports = {
contracts_directory: "./allMyStuff/someStuff/theContractFolder",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
注解
除了指定相对路径外,还可以使用 globs/regular 表达式来有选择地编译合约。
指定合约构建生成目录¶
编译合约的默认输出目录是相对于项目根目录的 ./build/contracts
。 这可以使用 contracts_build_directory
属性进行更改。
例如,将构建的合约工件(artifacts)放在 ./output/contracts
中:
module.exports = {
contracts_build_directory: "./output",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
构建的合约工件(artifacts)不需要位于项目根目录中:
module.exports = {
contracts_build_directory: "../../../output",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
绝对路径也可以,但是不建议这样做,因为在另一个系统上编译时可能不存在绝对路径。 如果在Windows上使用绝对路径,请确保对路径使用双反斜杠(例如:C:\\Users\\Username\\output
)。
迁移文件目录¶
默认迁移目录是项目根目录下的 ./migrations
文件夹。 可以使用 migrations_directory
更改此设置。
如:
module.exports = {
migrations_directory: "./allMyStuff/someStuff/theMigrationsFolder",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
指定编译器¶
在 compilers
对象中,我们可以指定与Truffle使用的编译器相关的设置。
solc¶
Solidity编译器设置, 支持 solc
的优化器(optimizer)设置。
可以指定…
solc-bin 上列出的所有的 solc-js 版本,需要的话,可以指定一个,Truffle 会自动获取它。
一个原生编译的 solc (需要自己安装,下面的链接帮助)。
这里有发布的docker竞相的(dockerized )solc 。
本地可用的 solc 路径
Truffle 配置示例:
module.exports = {
compilers: {
solc: {
version: <string>, // 版本号或约束字符串 - 如: "^0.5.0"
// 也可以指定为 "native" ,表示使用 native solc
docker: <boolean>, // 使用通过 docker 获得的版本
settings: {
optimizer: {
enabled: <boolean>,
runs: <number> // 优化次数
}
evmVersion: <string> // 默认: "byzantium"
}
}
}
}
有关详细信息,请参阅Solidity文档 - 编译器输入输出JSON描述.
使用外部编译器¶
如果要使用创建工件的更高级用法,可以使用外部编译器配置。
可以通过在Truffle配置中添加 compilers.external
对象来使用此功能:
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
/* 编译输出 */
}]
}
}
}
当我们运行 truffle compile 时,Truffle 将运行已配置的命令并查找 targets 指定的合约工件(artifacts)。
这个配置支持的几个主要用例:
编译命令可直接输出 Truffle JSON 工件(artifacts)。 如果编译命令能直接生成工件(artifacts),或生成包含工件的所有信息的输出,请按如下方式配置目标(target):
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
path: "./path/to/artifacts/*.json"
}]
}
}
}
Truffle 将执行我们的脚本,然后展开glob(*)并查找列出的路径中的所有.json文件,并将它们作为工件复制到 build/contracts/ 目录中。
编译命令输出工件的各个部分,我们希望Truffle 生成工件(artifacts)。 上述用例可能不适用于所有用例。 我们可以将 target 配置为运行“后处理命令”,如:
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
path: "./path/to/preprocessed-artifacts/*.json",
command: "./process-artifact"
}]
}
}
}
这将为每个匹配的 .json 文件运行 ./process-artifact ,该文件的内容作为 stdin 管道传输。 然后 ./process-artifact 命令(期望)输出一个完整的 Truffle 工件(artifact)作为 stdout。
如果想要提供路径代替文件名? 在 taget 配置中添加 stdin: false
。
我们还可以指定合约的各个属性,并让 Truffle 自己生成工件 (artifacts)。
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
properties: {
contractName: "MyContract",
/* other literal properties */
},
fileProperties: {
abi: "./output/contract.abi",
bytecode: "./output/contract.bytecode",
/* other properties encoded in output files */
}
}]
}
}
}
指定 properties
和/或 fileProperties
,Truffle 将在构建工件时查找这些值。
要覆盖所有指定路径和运行命令的工作目录,请使用 workingDirectory
选项。
例如,以下将运行 ./proj/compile-contracts
并读取 ./proj/output/contract.abi
:
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
workingDirectory: "./proj",
targets: [{
fileProperties: {
abi: "./output/contract.abi",
bytecode: "./output/contract.bytecode",
}
}]
}
}
}
插件 plugins¶
注解
仍处于”准系统状态”的新功能,同时还可向 Truffle 反馈改进意见!
为Truffle提供通过 NPM 安装(通过 dependencies 安装的)的第三方扩展的列表。
Truffle 插件目前仅支持自定义工作流命令的插件。 有关更多信息,请参阅第三方插件命令-编写脚本。