在Solidity中导入和加载源文件

将外部文件加载到Remix中有两个主要原因:

  • 导入库或依赖项(对于您不会编辑的文件)

  • 加载一些需要操作、编辑和测试的文件(对于您可能想要编辑的文件)

导入库或依赖项

当从NPM 或 URL (如 GitHub、IPFS 网关或 Swarm 网关) 导入时,您只需要在合约中使用 `import语句,无需在合约编译之前将依赖项预加载到文件资源管理器的当前工作空间中。

从import语句加载的文件放置在Files Explorer当前工作区的.deps文件夹中。

在幕后,Remix检查这些文件是否已经被加载到**.deps**目录中。如果没有,则通过unpkg获取它们(如果是NPM lib)。

以下是一些示例import语句:

从NPM里导入

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts@4.2.0/token/ERC20/ERC20.sol";

注意: 在上面的示例中,@openzeppelin是npm库的名称。在下面的示例中,该库的名称不以@开头 - 但Remix将会去检查npm是否有这个名称的库。

import "solidity-linked-list/contracts/StructuredLinkedList.sol";

从 Github URL 导入

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.5.0/contracts/math/SafeMath.sol";

如果有的话,您应该指定发布标签,否则将获取主分支中的最新代码。对于OpenZeppelin合约,您应仅使用在官方发布中发布的代码,上面的示例导入了OpenZeppelin Contracts v2.5.0版本。

从 Swarm 导入

import 'bzz-raw://5766400e5d6d822f2029b827331b354c41e0b61f73440851dd0d06f603dd91e5';

从 IPFS 导入

import 'ipfs://Qmdyq9ZmWcaryd1mgGZ4PttRNctLGUSAMpPqufsk6uRMKh';

导入不在 .deps 中的本地文件

要导入不在.deps文件夹中的文件,请使用相对路径(./)。例如:

import "./myLovelyLovelyLib.sol";

注意: 无法导入整个工作区。

从计算机的文件系统导入文件

这种方法使用 remix的 **remixd ** 守护进程。请访问 remixd(remixd.html)文档查看有关如何在浏览器和计算机文件系统之间建立桥梁的说明。

更多关于import关键字

关于import关键字的详细解释,见Solidity documentation

导入文件以进行操作。

当从主页小部件或通过控制台中的 remix 命令导入时,文件将被放置在当前工作空间的根目录中的一个文件夹内,该文件夹显示它们的来源,如 GitHub 或 Gists。

在 Remix 主页选项卡上的导入按钮

Gist, Github, Swarm, IPFS, & HTTPS 按钮将协助将文件导入Remix,以便您可以探索。

点击任何一个导入按钮都会弹出类似于这个的模态框:

不需要用引号包裹输入。

在控制台中使用remix命令进行加载

两个用于加载的remix命令是:

  • remix.loadurl(url)

  • remix.loadgist(id)

remix.loadurl('https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.5.0/contracts/math/SafeMath.sol')
remix.loadgist('5362adf2000afa4cbdd2c6d239e06bf5')

访问从主页选项卡或remix命令中加载的文件

当你从Github加载时,会在当前工作区的根目录下创建一个名为github 目录的文件夹。要从该文件夹导入文件,您可以使用以下命令:

import "github/OpenZeppelin/openzeppelin-contracts/contracts/math/SafeMath.sol";

请注意,此导入语句不包括 remix.load(url) 命令中的版本信息。因此建议您使用本页顶部描述的方法来导入您不打算编辑的依赖项。

假设包含上述导入语句的 .sol 文件位于 contracts 文件夹中。请注意,此导入语句无需使用相对路径遍历回 github 文件夹,例如:../github