npm包truffle-resolver-fix-relative-path-issue使用教程

阅读时长 11 分钟读完

前言

Web3开发中,我们经常会用到solidity语言编写的智能合约。而开发智能合约的第一步,是要配置一个本地的测试环境。有很多工具可以实现这个目的,Truffle是其中一个比较出色的框架。但是,使用Truffle的过程中,我们会遇到一个非常头疼的问题——相对路径的问题。这篇文章,将会介绍一个解决这个问题的npm包:truffle-resolver-fix-relative-path-issue。

问题描述

使用Truffle的过程中,我们可能需要在不同的项目之间复用合约,以及引用第三方库。这时,我们就需要在文件中使用相对路径来引用合约或者库。例如:

但是,这样做会导致一个问题:当我们在Truffle的开发环境中运行这个合约时,Truffle并不会解析相对路径,而是将这个路径视为相对于启动Truffle的路径。这样就会导致一个找不到文件的错误。

解决方案

truffle-resolver-fix-relative-path-issue是针对上述问题的解决方案。这个npm包可以在Truffle的开发环境中解析相对路径,并将相对路径转化为正确的绝对路径。这样,我们就可以在Truffle中成功地引用合约或者库了。

安装

我们可以使用npm来安装truffle-resolver-fix-relative-path-issue:

使用方法

1.首先,在truffle项目的根目录下,创建一个新的文件夹:resolver。

2.在resolver文件夹中创建一个新的文件:resolver.js。这个文件将会使用truffle-resolver-fix-relative-path-issue的功能来解析相对路径。

3.在resolver.js文件中,引入truffle-resolver-fix-relative-path-issue:

4.接下来,定义一个resolve方法,在这个方法中使用Resolver来解析相对路径。代码如下:

5.最后,在你的truffle项目的配置文件truffle.js(或者truffle-config.js)中,添加如下代码:

-- -------------------- ---- -------
-------------- - -
    -- ------
    ---------- -
        ----- -
            -------- -------- -- --------------------
            -- ------
            --------- -
                -- ------
                --------- -
                    -- ------------------
                    ------- -------------------------------
                --
                -- ------
            --
            -- ------
        -
    --
    -- ------
--

注意,x.x.x应当替换为你所使用的solc编译器的版本号。

示例代码

下面是一个示例代码。在这个示例中,我们将引用一个在truffle项目外部的合约库,然后在Truffle的开发环境中运行这个合约库:

1.创建一个新的文件夹:testproject,在这个文件夹中运行npm init -y,在这个文件夹中创建一个新的合约库:mylib.sol。

在mylib.sol中定义一个简单的合约:

-- -------------------- ---- -------
------ -------- --------

-------- ----- -

    -------- -------- -- ---- -- ---- -------- ------- ------ -
        ------ - - --
    -

-

2.创建一个新的Truffle项目:testtruffle,在testtruffle项目的根目录下,创建一个新的文件夹:resolver,在这个文件夹中创建一个新的文件:resolver.js,引入truffle-resolver-fix-relative-path-issue,并定义一个resolve方法。

resolver.js的代码如下:

-- -------------------- ---- -------
----- -------- - ----------------------------------------------------

-------- ------------------- ------------- -
    ----- --------------- - --- -----------
    ----- -------- - ----------------------------------- --------------
    ------ ---------
-

-------------- - -
    -------- -------
-

3.在mylib.sol的上级目录中,创建一个新的合约文件:mycontract.sol,在这个文件中引入mylib.sol库。

import "../mylib.sol";

contract MyContract {

}

4.在testtruffle项目的根目录下,为Truffle创建配置文件:truffle.js,配置文件的代码如下:

-- -------------------- ---- -------
----- -------- - -------------------------------

-------------- - -
  --------- -
    ------------ -
      ----- ------------
      ----- -----
      -- ------
    -
  --
  ---------- -
    ----- -
      -------- --------- -- --------------------
      --------- -
        ---------- -
          -------- -----
          ----- ---
        --
        --------- -
          ------- -------------------------------
        --
        ----------- -----------
      -
    -
  -
--

5.运行命令truffle compile,将mycontract.sol合约编译到build目录下。

6.在build目录下,找到compile-info.json文件,文件的内容如下:

-- -------------------- ---- -------
-
  ---------- -
    ----------------- -
      ------------ -
        ------------- -
          ------ ---
          ----------- -----
          ------ -
            ----------- -
              --------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            --
            ------------------- -
              --------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
              ---------- ---
              ------------ --
            -
          -
        -
      --
      ---------- ------------------------
    --
    ------------ -
      ------------ -
        -------- -
          ------ ---
          ----------- -----
          ------ -
            ----------- -
              --------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
              ---------- ---
              ------------ --
            --
            ------------------- -
              --------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
              ---------- ---
              ------------ --
            -
          -
        -
      --
      ---------- ------------------------
    -
  --
  ---------- -----------------------------------------
-

可以看到,compile-info.json中的bytecode已经正确地引用了mylib.sol库,并将相对路径转化为了绝对路径。

7.在Truffle的开发环境中运行mycontract.sol合约:

可以看到,MyContract中成功创建了MyLib实例,并调用了MyLib的add函数。

综上,通过使用truffle-resolver-fix-relative-path-issue,我们可以顺利地在Truffle中使用相对路径引用合约和库,从而提高我们的开发效率。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005728381e8991b448e8b8c

纠错
反馈