用 EthPM 进行包管理

EthPM 是以太坊的新包管理库。 它遵循ERC190规范,用于发布和使用智能合约包,并获得了许多不同的以太坊开发工具的广泛支持。 为了表示支持,我们也将以太坊包管理库(Package Registry) 直接集成到 Truffle 中。

安装软件包

从EthPM安装软件包几乎与通过NPM安装软件包一样简单。 我们只需运行以下命令:

$ truffle install <package name>

我们还可以在特定版本上安装软件包:

$ truffle install <package name>@<version>

与NPM一样,EthPM 版本遵循semver。 我们可以在以太坊软件包管理库)中找到所有可用软件包的列表。

安装依赖

项目里可以定义一个 ethpm.json 文件,它可以指定项目依赖及对应的版本。 要安装 ethpm.json 文件中列出的所有依赖,可以运行:

$ truffle install

有关 ethpm.json 文件的更多详细信息,请参阅下面的包配置

使用安装的合约

已安装的软件包将放在项目文件夹中的 installed_contracts 目录中。 如果不存在installed_contracts 目录,则会为我们创建。 这个文件夹就像用 NPM 处理 node_modules 文件夹一样 - 也就是说,你不应该编辑里面的内容,除非确切的知道自己在做什么。:)

安装的软件包可以在 测试、迁移、合约文件中 通过 importrequire 及合约的名称来引入。 例如,以下Solidity合约将从 owned 包导入 owned.sol 文件:

pragma solidity ^0.5.0;

import "owned/owned.sol";

contract LBCContract is owned {
  // ...
}

同样,以下迁移文件可以使用 ens 包中的 ENS.sol 合约:

File: ./migrations/2_deploy_contracts.js

var ENS = artifacts.require("ens/ENS");
var MyContract = artifacts.require("MyContract");

module.exports = function(deployer) {

// 如果ENS不存在时进行部署。
// 如果我们在测试网络上并且ENS不存在,将进行部署。

  deployer.deploy(ENS, {overwrite: false}).then(function() {
    return deployer.deploy(MyContract, ENS.address);
  });
};

请注意,在上面的迁移中,我们使用 ens 包并根据ENS是否已有地址来有条件地部署ENS合约。 这是deployer为我们提供的一种奇特技巧,可以更轻松地编写依赖于网络存在的迁移。

在这种情况下,如果我们在Ropsten网络上运行迁移,则此迁移不会部署 ENS 合约,因为(在撰写本文时)Ropsten 网络已经部署了规范的 ENS 合约,我们不需要部署自己的。 但是,如果我们正在针对不同的网络或测试网络运行部署,那么我们希望部署 ENS 合约,以便我们可以使用依赖的合约。

发布自己的软件包

发布我们自己的软件包与安装一样简单,像 NPM 一样,需要更多配置。

Ropsten, Ropsten, Ropsten

以太坊软件包管理库(Package Registry)目前存在于Ropsten测试网络中。 要发布自己的软件包,我们需要设置自己的Ropsten配置,因为需要用它签名交易。

在这个例子中,我们将使用 Infura 来发布包,需要使用 truffle-hdwallet-provider 模块以及Ropsten网络账号的助记符。 首先,在项目目录中通过NPM安装 truffle-hdwallet-provider

$ npm install truffle-hdwallet-provider --save

编辑配置文件 truffle.js : File:

var HDWalletProvider = require("truffle-hdwallet-provider");

// 12-word mnemonic
var mnemonic = "opinion destroy betray ...";

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*" // Match any network id
    },
    ropsten: {
      provider: () => 
          new HDWalletProvider(mnemonic, "https://ropsten.infura.io/v3/YOUR-PROJECT-ID"),
      network_id: 3 // official id of the ropsten network
    }
  }
};

包配置

与NPM一样,EthPM的配置选项文件名为 ethpm.json 。 此文件和 Truffle 配置文件在一个目录下,它为Truffle提供发布包所需的所有信息。 我们可以在配置部分中查看所有的配置项。

文件: ethpm.json

{
  "package_name": "adder",
  "version": "0.0.3",
  "description": "Simple contract to add two numbers",
  "authors": [
    "Tim Coulter <tim.coulter@consensys.net>"
  ],
  "keywords": [
    "ethereum",
    "addition"
  ],
  "dependencies": {
    "owned": "^0.0.1"
  },
  "license": "MIT"
}

命令

配置完成后,发布很简单:

$ truffle publish

我们将看到与下面类似的输出,并确认包已成功发布。

$ truffle publish
Gathering contracts...
Finding publishable artifacts...
Uploading sources and publishing to registry...我们
+ adder@0.0.3

在发布之前

当我们的配置有有不想发布的 artifacts, 可以在发布之前运行:

$ truffle networks --clean

这里可以参考更多 命令 使用。