前言
Web3开发中,我们经常会用到solidity语言编写的智能合约。而开发智能合约的第一步,是要配置一个本地的测试环境。有很多工具可以实现这个目的,Truffle是其中一个比较出色的框架。但是,使用Truffle的过程中,我们会遇到一个非常头疼的问题——相对路径的问题。这篇文章,将会介绍一个解决这个问题的npm包:truffle-resolver-fix-relative-path-issue。
问题描述
使用Truffle的过程中,我们可能需要在不同的项目之间复用合约,以及引用第三方库。这时,我们就需要在文件中使用相对路径来引用合约或者库。例如:
import "../lib/MyLib.sol";
但是,这样做会导致一个问题:当我们在Truffle的开发环境中运行这个合约时,Truffle并不会解析相对路径,而是将这个路径视为相对于启动Truffle的路径。这样就会导致一个找不到文件的错误。
解决方案
truffle-resolver-fix-relative-path-issue是针对上述问题的解决方案。这个npm包可以在Truffle的开发环境中解析相对路径,并将相对路径转化为正确的绝对路径。这样,我们就可以在Truffle中成功地引用合约或者库了。
安装
我们可以使用npm来安装truffle-resolver-fix-relative-path-issue:
npm install truffle-resolver-fix-relative-path-issue --save-dev
使用方法
1.首先,在truffle项目的根目录下,创建一个新的文件夹:resolver。
2.在resolver文件夹中创建一个新的文件:resolver.js。这个文件将会使用truffle-resolver-fix-relative-path-issue的功能来解析相对路径。
3.在resolver.js文件中,引入truffle-resolver-fix-relative-path-issue:
const Resolver = require('truffle-resolver-fix-relative-path-issue');
4.接下来,定义一个resolve方法,在这个方法中使用Resolver来解析相对路径。代码如下:
function resolve(importPath, importedFrom) { const truffleResolver = new Resolver(); const filePath = truffleResolver.resolve(importPath, importedFrom); return filePath; }
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 {
function testAdd() pure public returns(uint) { MyLib myLib = new MyLib(); return myLib.add(2,3); }
}
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合约:
truffle develop > migrate > let myContract = await MyContract.deployed() > let result = await myContract.testAdd() > result 5
可以看到,MyContract中成功创建了MyLib实例,并调用了MyLib的add函数。
综上,通过使用truffle-resolver-fix-relative-path-issue,我们可以顺利地在Truffle中使用相对路径引用合约和库,从而提高我们的开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005728381e8991b448e8b8c