将命令行参数传递给package.json中的npm脚本

将命令行参数传递给package.json中的npm脚本,npm,package.json,npm-scripts,Npm,Package.json,Npm Scripts,我的package.json中有以下脚本: "scripts": { "vumper": "node node_modules/vumper/index.js", "format": "prettier --single-quote -width=80 --write package.json" }, “vumper”包接受命令行参数(如“dv”)。我希望能够有一个连续运行这两个命令的命令 基本上,我希望能够运行: npm run vumber dv 然后 npm run

我的package.json中有以下脚本:

"scripts": {
    "vumper": "node node_modules/vumper/index.js",
    "format": "prettier --single-quote -width=80 --write package.json"
 },
“vumper”包接受命令行参数(如“dv”)。我希望能够有一个连续运行这两个命令的命令

基本上,我希望能够运行:

npm run vumber dv
然后

npm run format
但在一个命令中,类似于

npm run my-build dv
它将运行上述两个命令,正确接受命令行参数“dv”,并将其传递给第一个npm run vumper。这可能吗?

简短回答: 本质上,您想要的是有一个类似这样的npm脚本,
,如下所示:

package.json

。。。
“脚本”:{
“我的构建”:“func(){npm run vumper\“$1\”&&npm run format;};func”,
“vumper”:“node node_modules/vumper/index.js”,
“格式”:“更漂亮--单引号-宽度=80--写package.json”
},
...
说明:

名为
func
的Bash函数执行以下操作:

  • 首先运行
    npm运行vumper/参数)
  • 随后,它通过命令
    npm run format
    运行名为
    format
    的脚本
  • 这两个
    npm run
    命令使用
    &
    操作符链接,因此第二个
    npm run format
    命令只有在初始
    npm run vumper将
    --
    选项描述为:

    。。。特殊选项
    --
    用于限定选项的结尾。npm将把
    --
    后面的所有参数直接传递给脚本:。。。参数将仅传递给
    npm run
    之后指定的脚本,而不会传递给任何pre或post脚本


    解决方案2-跨平台: 对于跨平台解决方案(成功地与Bash、Windows命令提示符/cmd.exe和PowerShell等配合使用的解决方案),您需要使用如下nodejs帮助程序脚本

    run.js

    让我们将nodejs脚本命名为run.js,并将其保存在projects根目录中,与package.json处于同一级别

    const execSync=require('child_process')。execSync;
    常量arg=process.argv[2]||“dv”;//如果通过CLI未提供参数,则默认值为'dv'。
    execSync('npm run vumper'+arg,{stdio:[0,1,2]});
    execSync('npm运行格式',{stdio:[0,1,2]});
    
    package.json

    my build
    脚本配置为调用run.js,如下所示:

    。。。
    “脚本”:{
    “我的构建”:“节点运行”,
    “vumper”:“node node_modules/vumper/index.js”,
    “格式”:“更漂亮--单引号-宽度=80--写package.json”
    },
    ...
    
    运行
    我的构建
    脚本:

    根据解决方案1,要通过CLI调用
    my build
    ,您需要运行:

    npm运行我的构建--dv
    
    说明:

    • run.js用于获取通过CLI传递的参数(例如,
      dv
      )。如果在运行
      npm run my build
      时未提供任何参数,则默认值(即
      dv
      )将传递给
      vumper
      npm脚本

    • run.js还利用来抛出/调用两个
      npm run
      命令

    Npm现在有一个内置选项,可以将cli参数直接传递给脚本。 cli参数存储在前缀为
    npm\u config
    的环境变量中,它们需要非常严格的语法,格式为
    -->=

    例如:

     "my-build": "npm run vumper %npm_config_myflag% && npm run format",
    
    在终端中,运行
    npm run my build--myflag=my_value
    以执行
    npm run vumper my_value&&npm run format

    注:

    要在npm脚本中引用环境变量,必须使用特定于平台的语法,即Windows中的
    %npm\u config\u myflag%
    ,或Linux中的
    $npm\u config\u myflag

    更新:

    要避免与用于配置npm本身的npm_配置变量发生冲突的风险,只需在参数前面加上唯一的前缀,例如应用程序的名称


    潜在冲突是一个非常常见的问题,适用于许多环境:任何应用程序都可以使用其他应用程序已经使用的环境变量;因此,环境变量通常以应用程序的名称作为前缀(例如NVM_HOME、JAVA_HOME)。但这种潜在冲突并不是避免使用环境变量的好理由。我认为这同样适用于npm参数/npm_配置环境变量。没有提到冲突的风险,这意味着我想应该像往常一样管理冲突。

    我首选的方法是使用环境变量:

    {
    “脚本”:{
    “ncc构建”:“ncc构建$ACTION/src/index.ts-o$ACTION/dist”,
    “构建:pr变更日志”:“操作=pr变更日志npm运行ncc构建”,
    }
    }
    

    它应该在UNIX系统中工作。不过,我不确定windows平台是否兼容。

    是否有一个cli npm包可以简单地执行类似于
    const args=process.argv.slice(3)
    const命令=args.reduce(
    (res,arg,index)=>res.replace(新的RegExp(\\\${index+1},'g'),arg),
    process.argv[2]
    const execSync=require('child_process')。execSync
    execSync(命令,{stdio:[0,1,2]})?。这样我就可以用\“并使用这样的cli作为前缀,运行任何带有有序参数的脚本……平台特定是我的关键。我在Windows上尝试了
    $npm\u config\u myflag
    ,失去了我的心智npm也为内部目的创建了自己的名为
    npm\u config.*
    的环境变量。确保为标记/选项选择一个名称(例如,
    --myflag=*
    ),该名称不会覆盖内部使用的名称,因为这可能会产生不需要的结果。您可以
    cd
    到您的项目目录并运行
    npmru