如何为hardhat run命令执行的TS脚本传递自定义参数?
解决Hardhat运行脚本时传入自定义参数的两种方案
方案1:直接给hardhat run指定的脚本传参
Hardhat支持通过--分隔符区分Hardhat自身参数和脚本参数,你期望的命令可以调整为以下格式:
npx hardhat run --network rinkeby scripts/task-executor.ts -- param1 param2
其中--是必须的,作用是告知Hardhat后续参数无需作为Hardhat自身参数解析,直接透传给目标脚本。
在task-executor.ts中直接通过process.argv读取参数即可,示例代码如下:
// scripts/task-executor.ts import { ethers } from "hardhat"; async function main() { // process.argv前两位分别是node路径、脚本路径,后续元素为传入的自定义参数 const param1 = process.argv[2]; const param2 = process.argv[3]; console.log("参数1:", param1); console.log("参数2:", param2); // 此处填写你的业务逻辑 } main().catch((error) => { console.error(error); process.exitCode = 1; });
该方案无需修改Hardhat配置,完全贴合你期望的命令使用习惯。
方案2:正确定义自定义Hardhat任务(解决HH9报错)
你之前出现HH9报错是因为在Hardhat配置文件加载阶段,提前导入了hardhat包下的hre或ethers,此时Hardhat还未完成初始化。正确的自定义任务写法如下:
// hardhat.config.ts import { HardhatUserConfig, task } from "hardhat/config"; import "@nomiclabs/hardhat-ethers"; // 禁止在配置文件顶部导入hre/ethers,会触发HH9错误 // 定义自定义任务 task("runExecutor", "执行task-executor逻辑") .addPositionalParam("param1", "第一个自定义入参") .addPositionalParam("param2", "第二个自定义入参") .setAction(async (taskArgs, hre) => { // 所有依赖hre/ethers的逻辑都写在setAction回调内,回调接收的hre是已完成初始化的实例 const { ethers } = hre; const param1 = taskArgs.param1; const param2 = taskArgs.param2; console.log("参数1:", param1); console.log("参数2:", param2); // 此处填写你的业务逻辑 }); const config: HardhatUserConfig = { // 你原有的配置内容,比如solidity版本、网络配置等 solidity: "0.8.17", }; export default config;
配置完成后使用以下命令执行即可:
npx hardhat runExecutor --network rinkeby param1 param2
内容的提问来源于stack exchange,提问作者DB - Solhint TL - Protofire
相关产品推荐
相关产品推荐

