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 插件目前仅支持自定义工作流命令的插件。 有关更多信息,请参阅第三方插件命令-编写脚本。