Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为npm脚本提供部分路径名(作为参数)_Javascript_Npm_Yarnpkg_Npm Scripts - Fatal编程技术网

Javascript 为npm脚本提供部分路径名(作为参数)

Javascript 为npm脚本提供部分路径名(作为参数),javascript,npm,yarnpkg,npm-scripts,Javascript,Npm,Yarnpkg,Npm Scripts,是否可以读取包.json的脚本中的CLI参数。我在找这样的东西: { "scripts": { "example": "ts-node --project tsconfig.json ./examples/${1}/.ts" } } 其中,${1}将被传递给的第一个参数替换 npm run example yadda 并最终运行 ts-node --project tsconfig.json ./examples/yadda/.ts 我知道我可以编写一个JS文件,npm可以

是否可以读取
包.json
脚本中的CLI参数。我在找这样的东西:

{
  "scripts": {
    "example": "ts-node --project tsconfig.json ./examples/${1}/.ts"
  }
}
其中,
${1}
将被传递给的第一个参数替换

npm run example yadda
并最终运行

ts-node --project tsconfig.json ./examples/yadda/.ts

我知道我可以编写一个JS文件,npm可以调用并运行该文件来读取CLI参数,但我想知道是否可以从npm脚本条目中读取参数。

您可以使用以下语法(不特定于npm本身)

在你的脚本部分,你可以这样做

"example": "ts-node --project tsconfig.json ./examples/$MY_VAR/.ts"

您可以将示例命令设置为运行脚本

{
  "scripts": {
    "example": "node --project tsconfig.json ./yourscript.js"
  }
}
然后在脚本中使用参数

var args=process.argv.splice(process.execArgv.length+2);
args.forEach((值,索引)=>{
log(`Argument${index}是:${value}`);
});

然后,您可以调用运行
npm run example arg1 arg2
的脚本,并使用其中一个参数导入/需要另一个文件或有条件地运行特定代码。

不幸的是,npm没有也不打算提供内置功能,允许将参数传递到npm脚本的中间(如上所述)。参数只能传递到脚本的末尾

假设在您的示例中,您希望将一个参数传递到脚本的中间(基本上创建一个新的路径名),那么您需要利用一种变通方法

在*nix平台(Linux、macOS等)上,npm使用的默认shell是
sh
。因此,您可以利用npm脚本中的作为处理要传递到脚本中间的参数的机制

package.json

。。。
“脚本”:{
“示例”:“func(){ts节点--project tsconfig.json\”/examples/${1}.ts\”;};func”
},
...
说明:

  • 在脚本末尾,即尾部的
    func
    部分调用任意命名的shell函数
    func
    ,在脚本开头定义。基本上,通过CLI提供的参数(例如,
    yadda
    )被传递给它
  • func
    函数体中,我们执行
    ts node
    命令。参数(例如,
    yadda
    )在函数体中使用
    $1
    (即第一个/参数)引用
跑步:

通过命令行运行以下命令

npm运行示例yadda
最终将作为:

ts节点——项目tsconfig.json./examples/yadda.ts

注意事项:

  • 使用
    cmd.exe
    作为默认shell的Windows将无法满足上述解决方案

  • >P>您可能还想考虑在CLI没有提供参数的情况下提供默认值。例如:

    package.json

    。。。
    “脚本”:{
    “示例”:“func(){ts节点--project tsconfig.json\”/examples/${1:-foobar}.ts\”;};func”
    ^^^^^^^^
    },
    ...
    
    注意
    ${1:-foobar}
    部分,而不仅仅是
    ${1}
    。这意味着在不提供参数的情况下运行脚本。例如:

    npm运行示例
    
    最终将作为:

    ts节点——项目tsconfig.json./examples/foobar.ts
    ^^^^^^
    
    但是,当提供参数时,例如:

    npm运行示例yadda
    
    它仍将像以前一样运行,即

    ts节点——项目tsconfig.json./examples/yadda.ts
    

    跨平台:


    如果需要跨平台解决方案,即同时使用
    sh
    cmd.exe
    运行的解决方案,那么实际上只剩下一个选项,正如您所说的:“编写一个可以由npm调用和运行的JS文件,该文件将读取CLI参数[…使用并使用or退出
    ts node
    命令]

    看看这里@Emanuele,这是一个JS脚本中的内容。这就是为什么我在最后一句中写道我不想这样做好的对不起,你是对的看看我的答案这就是你的意思谢谢。一个有效的答案,但不是我想要的100%。我会投票,但不会接受它已解决。谢谢。谢谢,但作为回答我在问题中说,这是我明确不想做的(使用脚本文件)。相反,我只想使用package.json的scripts字段。使用脚本是一种常见的做法,没有客观的理由不使用它们。如果你真的想这样做,Emanuele的回答是唯一的方法。没有客观的理由是一种意见,这是值得怀疑的。在我的情况下,我不想用脚本来扰乱我的回购协议我不需要任何其他的构建脚本。你知道,干净的代码和其他东西。而且,如果有一个像我要求的那样的解决方案,那可能就是最好的解决方案。这就是我为什么要问的原因。不,不是,因为这是传递参数的唯一方法,正如npm RUN的一样。相反,我不是说你问的问题不好。Setting这样的环境变量(即
    MY\u VAR=foo
    ),当默认shell为cmd.exe时,将在Windows上失败。此外,Windows
    cmd.exe
    在引用带有美元前缀的变量时失败,例如
    $MY\u VAR
    ,因为预期的语法是
    %MY\u VAR%
    。如果参数是文件夹名而不是文件名(如我前面的问题所述)然后在
    ${1}
    部分之后恢复正斜杠。
    {
      "scripts": {
        "example": "node --project tsconfig.json ./yourscript.js"
      }
    }