3. 构建流程

自定义构建流程

纵贯Truffle的发展历史看来,默认构造器并不适合每一个人。它有一些明显的缺点,且相比其它构建系统显得不太成熟。由此,Truffle提供了三种方式,来让你扩展默认的构建系统,但让你能体验到绝大部分的Truffle的特性。

执行外部命令

如果你希望在每次触发构建时,执行一个外部命令。可以在项目的配置中包含一个选项。

module.exports = {
  // This will run the `webpack` command on each build.
  //
  // The following environment variables will be set when running the command:
  // WORKING_DIRECTORY: root location of the project
  // BUILD_DESTINATION_DIRECTORY: expected destination of built assets (important for `truffle serve`)
  // BUILD_CONTRACTS_DIRECTORY: root location of your build contract files (.sol.js)
  // WEB3_PROVIDER_LOCATION: rpc configuration as a string, as a URL needed for web3's http provider.
  //
  build: "webpack"
}

需要注意的是,你需要提供对应的环境变量,来将这些外部的脚本命令集成进Truffle,详见配置中的备注。

提供一个自定义的函数

你可以提供了一个自定义的构建函数。框架给提供给你工程相关的参数,方便你与Truffle进行深度集成。

module.exports = {
  build: function(options, callback) {
     // Do something when a build is required. `options` contains these values:
     //
     // working_directory: root location of the project
     // contracts: metadata about your contract files, code, etc.
     // contracts_directory: root directory of .sol files
     // rpc: rpc configuration defined in the configuration
     // destination_directory: directory where truffle expects the built assets (important for `truffle serve`)
  }
}

创建一个自定义的模块

你也可以通过创建一个模块或对象来实现构建接口(一个包含build函数的对象,就像上一节中那样)。这适用于需要集成Truffle,但又有自已的发布流程情况。

下面是一个使用默认构建模块的一个例子。

var DefaultBuilder = require("truffle-default-builder");
module.exports = {
  build: new DefaultBuilder(...) // specify the default builder configuration here.
}

初始化前端

因为你使用了你自己的构建流程,Truffle不再知道如何初始化你的前端。下面是一个需要做的事清单:

  • 引入Web3
  • 初始化一个web3的实例,设置一个provider指向到你的以太坊客户端。检查web3对象是否已经存在是十分重要的,因为如果有人通过钱包浏览器,比如Metamask或Mist,对象很有可能已存在,这时你应该使用这个对象,而不是初始化一个全新的。查看例子了解更多。
  • requireimport编译好的sol.js文件从./build/contracts目录。对每个文件需要调用MyContract.setProvider()来设置provider。这需要与web3实例使用provider是一致的。可以使用web3.currentProvider来获得当前的provider
var MyContract = require("./build/contracts/MyContract.sol.js");
MyContract.setProvider(web3.currentProvider);

使用WEBPACK

我们还在致力于与Webpack的紧密集成。可以通过这里,来沟通你的想法。

如果任何问题,欢迎留言批评指正。

处于某些特定的环境下,可以看到评论框,欢迎留言交流^_^。