带参数运行的安全帽

11
我需要在命令行中使用Hardhat运行特定的ts脚本,但我需要指定参数... 类似于这样:
npx hardhat run --network rinkeby scripts/task-executor.ts param1 param2

--network rinkebyhardhat run 的参数
param1param2task-executor.ts 脚本的参数。
我找不到任何关于这个问题的帖子,也无法使其工作。

我还尝试定义了一个 hardhat 任务并添加了这些参数,但是如果我尝试执行它,我会得到:

Error HH9: Error while loading Hardhat's configuration.    
You probably tried to import the "hardhat" module from your config or a file imported from it.
This is not possible, as Hardhat can't be initialized while its config is being defined.

因为我需要在那个特定的任务中从hardhat导入hreethers
我该如何实现我所需要的?

这个链接没有帮助吗?使用它,您可以在参数中获取所有内容。您能附上您的代码吗?查看出错的位置可能会有帮助。 - munanadi
5个回答

13
根据Hardhat的说法:
Hardhat脚本适用于不需要用户参数的简单任务,以及与不适合Hardhat CLI的外部工具(如Node.js调试器)集成。

对于需要参数的脚本,您应该使用Hardhat任务
您可以在不同的文件中编写任务,而不是hardhat.config.ts。这里是一个使用位置参数的示例任务,在文件sampleTask.ts中:
import { task } from "hardhat/config";

task("sampleTask", "A sample task with params")
  .addPositionalParam("param1")
  .addPositionalParam("param2")
  .setAction(async (taskArgs) => {
    console.log(taskArgs);
  });

记得在 hardhat.config.ts 文件中导入它:

import "./tasks/sampleTask";

然后使用以下命令运行:
npx hardhat sampleTask hello world 

它应该打印:

{ param1: 'hello', param2: 'world' }

你可以在这里了解有关命名、位置和可选参数的更多信息 here
如果需要使用hreethers,可以从setAction函数的第二个参数中获取hre
task("sampleTask", "A sample task with params")
  .addPositionalParam("param1")
  .addPositionalParam("param2")
  .setAction(async (taskArgs, hre) => {
    const ethers = hre.ethers;
  });

抱歉...我读了Hardhat文档...我在我的第一篇帖子中提到了我尝试实现Hardhat任务并得到的错误...看起来得到那个错误是合理的。 - Anibal Estevez
假设我有一个需要两个参数a和b的合约。如果我要使用hre部署此合约,可以通过以下方式:const assetContract = await AssetContract.deploy(a, b);。那么我该如何通过.addPositionalParam方法调用来传递这些参数呢? - bongoSLAP
2
@bongoSLAP npx hardhat sampleTask a-param b-param你也可以使用sampleTask.addParam('a', 'does a').addParam('b', 'does b thing')并使用npx hardhat sampleTask --a aVal --b bVal - Ally Haire

5

你可以使用环境变量,并通过process.env进行访问

在Linux上:

param1=some param2=thing npx hardhat run scripts/task-executor.ts

并使用以下代码打印:

console.log(process.env.param1);

0

检查脚本和任务之间的区别以及如何选择可能会很有用:Hardhat在文档中提供了此链接


欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接到的页面中最相关的部分,以防目标页面无法访问。 - cursorrux
谢谢@cursorux,我会记住的! - Betzabe Silva

0
我找到了一个解决方案,我们可以通过使用任务来部署合约。我不确定上述问题是否是由于deployContract()和deploy()之间的差异引起的。
这是我的greeter_deploy.js。
const fs = require("fs");
async function deploy(walletAddress, hre) {
    const studentWalletAddress = walletAddress;
    const greeter = await hre.ethers.deployContract("Greeter", [studentWalletAddress]);
    const contract = await greeter.waitForDeployment();
    console.log("Greeter is deployed on network: Goerli at address:", await contract.getAddress());
    result = { walletAddress: walletAddress, contractAddress: await contract.getAddress(), challenge: "greeter" };
    fs.appendFileSync("address.txt", JSON.stringify(result) + "\n");
}

task("greeter_deploy", "Deploys the Greeter contract with student wallet")
    .addPositionalParam("walletAddress", "The student wallet address")
    .setAction(async (taskArgs, hre) => {
        console.log("taskArgs", taskArgs);
        await hre.run("compile");
        await deploy(taskArgs.walletAddress, hre).catch(async (error) => {
            console.error(error);
            process.exitCode = 1;
        });
    });


此外,不要忘记在 hardhat.config.js 中导入任务。
require("./tasks/greeter_deploy");

正在运行的任务:
$ npx hardhat greeter_deploy 0xfBfE37229AE38F83E0C718efF6E8B5A1194C9127 --network goerli

我们还可以在 hardhat.config.js 中指定默认网络。

-5
通常它的工作方式如下:
const hre = require('hardhat'); 
const { ethers } = hre; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接