Truffle 5 手册:Truffle配置文件

配置文件概述

配置文件名为truffle-config.js,位于Truffle项目的根目录,这是一个JavaScript文件, 其中可以包含任意代码,并且必须导入一个用来表征项目配置的对象,例如:

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*" // 可匹配任意网络
    }
  }
};

上面这个配置文件,是在创建truffle项目时生成的默认配置文件,其中声明了一个名为development的 单节点开发网络,该节点在地址127.0.0.1:8545监听。

networks - 网络配置

networks配置用来指定在部署合约、发送交易时使用哪个网络节点。 当在某个特定的网络节点上编译或部署合约时,合约会缓存起来方便后续使用。 当truffle的合约抽象层检查到你连到某个网络节点时,它会使用这个这个网络 节点上原有的缓存合约来简化部署流程。

下述的networks对象,以网络名称作为配置键,值对应定义了相应的网络参数:

n```java etworks: { 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提供器实例对象 // - 返回web3提供器实例对象的函数 // - 如果指定该参数的话,则忽略host和port // skipDryRun: -如果设置为true,则跳过迁移脚本的本地测试环节直接执行。默认为false // timeoutBlocks: - 交易未入块时需要等待的区块数量,默认值为50 } }

networks选项是必须的,否则truffle不知道如何部署合约。truffle init创建 的默认网络配置提供了一个开发用网络,可以匹配所连接的任何网络 —— 这在 开发期是很有帮助的,但在生产环境中并不合适。要配置Truffle连接到其他 网络,只需要简单地添加更多的命名网络并指定相应的网络ID即可。

网络名称在通过用户接口调用时使用。例如,在部署合约时使用--network选项 指定要使用的网络节点:

```java
$ truffle migrate --network live

对于每一个配置的网络,在未明确设置以下交易参数时,使用其默认值:

  • gas:部署合约的gas上限,默认值:4712388
  • gasPrice:部署合约时的gas价格,默认值:100000000000 wei,即100 shannon
  • from:执行迁移脚本时使用的账户,默认使用以太坊节点旳第一个账户
  • provider:默认的web3 provider,使用host和port配置选项构造:new Web3.providers.HttpProvider("http://:")
  • websockets:需要启用此选项以使用确认监听器,或者使用.on或.once监听事件。默认值为false 一个网络,可以指定 host/port或provider,但不可以同时使用这两个选项。 如果你需要一个HTTP提供器,建议使用host和port配置;如果需要一个自定义提供器 例如HDWalletProvider,那么必须使用provider配置。

web3提供器

下面的网络配置中包含有一个本地测试网络,以及一个infura接入的Ropsten测试网络, 这两个网络都使用HDWalletProvider提供器。请确保像下面代码这样,使用闭包来封装 truffle-hardware提供器,以确保同一时间仅连接一个网络:

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将使用host和port的配置值 创建默认的HTTP提供器,在这种情况下就不能使用自定义的提供器了。

contracts_directory - 合约目录配置

在truffle项目中,合约源代码的默认目录是项目根目录下的contracts子目录。 如果你需要在其他目录中保存合约代码文件,那么需要使用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表达式来指定要编译的合约。

contracts_build_directory - 合约构建目录配置

合约编译结果的默认输出目录是项目根目录下的./build/contracts子目录。 使用contracts_build_directory配置来指向其他目录。

配置示例

使用下面的配置来将构建结果输出到./output/contracts目录:

module.exports = {
  contracts_build_directory: "./output",
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*",
    }
  }
};

生成的合约构件不需要位于项目根目录中,例如下面的配置:

module.exports = {
  contracts_build_directory: "../../../output",
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*",
    }
  }
};

也可以使用绝对路径,不过不推荐这么做,因为在其他系统编译时所指定 的绝对路径可能不存在。如果你在Windows上使用绝对路径,请确保使用 双反斜杠符号,例如C:\Users\Username\output。

migrations_directory - 迁移脚本目录配置

默认的迁移脚本目录是项目根目录下的./migrations子目录。可以 使用migrations_directory配置进行修改。

配置示例 下面的配置使用./allMyStuff/someStuff/theMigrationsFolder目录中 的迁移脚本:

module.exports = {
  migrations_directory: "./allMyStuff/someStuff/theMigrationsFolder",
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*",
    }
  }
};

mocha - 测试配置

用于MochaJS测试框架的配置。该配置对象应当满足Mocha的要求。

配置示例

下面的配置要求mocha使用彩色文本:

mocha: {
  useColors: true
}

compilers.solc - SOlidity编译器配置

compilers.solc配置用来声明Solidity编译器的参数。支持solc的优化器设置。

可以指定:

solc-bin中的任何solc-js版本。指定一个你希望Truffle使用的版本 - 一个本地编译的solc程序,不过你需要自己安装 - 一个solc的docker镜像 - 一个执行本地可用的solc的路径

配置示例

module.exports = {
  compilers: {
    solc: {
      version: <string>, // A version or constraint - Ex. "^0.5.0"
                         // Can also be set to "native" to use a native solc
      docker: <boolean>, // Use a version obtained through docker
      settings: {
        optimizer: {
          enabled: <boolean>,
          runs: <number>   // Optimize for how many times you intend to run the code
        },
        evmVersion: <string> // Default: "byzantium"
      }
    }
  }
}

external compilers - 外部编译器配置

可以使用外部编译器配置用于以更高级的方式生成Truffle构件, 格式如下:

module.exports = {
  compilers: {
    external: {
      command: "./compile-contracts",
      targets: [{
        /* compilation output */
      }]
    }
  }
}

当运行truffle compile时,Truffle将运行配置的命令,并查看targets指定的合约构件。

应用场景

这个新的Truffle配置项主要用来支持以下的应用场景。

  • 编译命令直接生成构件
  • 编译命令生成构件元素,truffle生成最终的构件
  • 指定合约的属性,truffle生成最终的构件

编译命令直接生成构件

如果编译命令直接生成构件,或者编译输出中包含构件的所有信息,那么可以如下配置:

module.exports = {
  compilers: {
    external: {
      command: "./compile-contracts",
      targets: [{
        path: "./path/to/artifacts/*.json"
      }]
    }
  }
}

Truffle将执行上述脚本,然后扩展glob(*)并查找列出的目录中的所有.json文件, 并拷贝到build/contracts/目录。

编译命令生成构件元素,truffle生成最终的构件 如果编译命令生成构件的各组成部分,你希望Truffle帮你生成最终的构件,那么可以 配置target来运行任意后处理命令:

module.exports = {
  compilers: {
    external: {
      command: "./compile-contracts",
      targets: [{
        path: "./path/to/preprocessed-artifacts/*.json",
        command: "./process-artifact"
      }]
    }
  }
}

这个配置将为每个匹配的.json文件运行./process-artifact。./process-artifact 命令将在stdout输出完整的Truffle构件。

指定合约的属性,truffle生成最终的构件 也可以指定合约的具体属性,然后由Truffle生成构件:

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 */
        }
      }]
    }
  }
}

使用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",
        }
      }]
    }
  }
}
全部评论(0)
给作者留言