传递命令行 - Yarn中子脚本的参数

时间:2018-06-13 10:44:17

标签: node.js npm package.json yarnpkg npm-scripts

我有一个类似于这个的package.json:

"scripts": {
    "dev": "cross-env BABEL_ENV=client webpack --config webpack/client.development.js && yarn dev:stub-server | cross-env BABEL_ENV=server babel-node src/server/server.js",
    "dev:stub-server": "./node_modules/.bin/robohydra ./stubs/robohydra-config.json -p 3100"
}

我在代码中添加了一些逻辑,以根据命令行参数更改dev:stub-server的配置方式。因此,每当我运行以下内容时,我都会得到我期望的结果:

yarn dev:stub-server --results=4
$ ./node_modules/.bin/robohydra ./stubs/robohydra-config.json -p 3100 -- --results=4

如您所见,选项将转发到底层脚本,一切都按预期工作。

我的问题是我无法将--resultsyarn dev命令传播到dev:stub-server的正确位置。父脚本运行dev:stub-server,但参数最后会转发到底层脚本,如下所示:

yarn dev --results=2
$ cross-env BABEL_ENV=client webpack --config webpack/client.development.js && yarn dev:stub-server | cross-env BABEL_ENV=server babel-node src/server/server.js --results=2

有没有办法让上述工作如下呢?

yarn dev --results=2
$ cross-env BABEL_ENV=client webpack --config webpack/client.development.js && yarn dev:stub-server --results=2 | cross-env BABEL_ENV=server babel-node src/server/server.js

提前致谢!

7 个答案:

答案 0 :(得分:5)

Yarn's run仅支持将args附加到命令链的末尾,并且至少截止日期为2018-06-14,没有办法覆盖它。

当我过去需要这个时,我已经制作了我自己的dev.js脚本,这个脚本由我的package.json调用,然后将环境变量拉出来。

答案 1 :(得分:1)

在Mac上,我正在使用:

"scripts": {
  "benchmark": "sh -c 'ng run ${0}:benchmark'",
}

然后我调用yarn benchmark editor,其中editor是我的参数。

答案 2 :(得分:1)

就目前而言,使用 yarn 1.22.4 您可以执行 yarn exec tsc -- --help。附加 -- 可以解决问题

答案 3 :(得分:0)

或者,您可以在脚本中使用*.env文件和变量cat

"run":"docker build -t --build-arg VAR=`cat vars.env` -f Dockerfile .

例如

答案 4 :(得分:0)

我在这里发布了一些内容(两行代码)。 https://stackoverflow.com/a/65265945/12463120

要注意的是,Webpack没有转发CLI。因此,您必须先保存它们。

// webpack.config.js 
process.env.MY_APPLICATION_NAME_ARGS = JSON.stringify(process.argv)
// your.script.js
const myArgs = JSON.parse(env.MY_APPLICATION_NAME_ARGS )

答案 5 :(得分:0)

一种简单的实现方法是使用an inline Bash function来编写parameter expansion with $*

"scripts": {
    "dev": "wrap () { node index.js \"$*\" | cat; }; wrap"
}

使用yarn dev foo bar调用上面的命令将运行node index.js foo bar,然后将结果作为演示通过管道传递到cat
您可以在命令的开头和结尾处添加命令,只需记住这里需要使用半角符号。

对于涉及更多的内容,您可能需要一个独立的脚本。

答案 6 :(得分:0)

使用 npm 功能将命名的自定义参数传递给命令行作为 yarn 命令的代理:

 "scripts": {
      "yarn-cmd": "npm run npm-cmd --foo=bar",
      "npm-cmd": "echo \"foo value is $npm_config_foo\""
    }

运行yarn yarn-cmd

阅读更多:https://docs.npmjs.com/cli/v7/using-npm/config