将命令行——参数传递给 Yarn 中的子脚本

Pass command line -- argument to child script in Yarn

我有一个 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。父脚本运行s 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

提前致谢!

Yarn's run 仅支持将 args 附加到命令链的末尾,至少截至 2018 年 6 月 14 日,没有办法覆盖它。

当我过去需要这个时,我编写了自己的 dev.js 脚本,由我的 package.json 调用,并将 args 提取到环境变量中。

在 mac 我正在使用:

"scripts": {
  "benchmark": "sh -c 'ng run [=10=]:benchmark'",
}

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

作为替代方案,您可以在脚本中使用 *.env 文件和 cat 文件中的变量。

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

例如

像这样做。由于 yarn 本质上会传递参数。

"scripts": {
  "runSomeShellScriptAlpha": "path/to/script_name.sh    ", // redundant $x
  "runSomeShellScriptBeta": "path/to/script_name.sh",            // better 
}
yarn runSomeShellScriptBeta p1 p2 p3

alpha one 仅适用于 Mac/Linux,不适用于 Win10。坏了。

测试版适用于 Mac/LinuxWin10

我在这里发布了一些东西(2 行代码)。

请注意 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 )

实现此目的的一种直接方法是编写 using parameter expansion with $*:

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

yarn dev foo bar 调用上面的代码将 运行 node index.js foo bar 然后将结果通过管道传输到 cat 作为演示。
您可以在开始和结束时添加命令,请记住这里需要半决赛。

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

至于现在,使用 yarn 1.22.4 你可以做到 yarn exec tsc -- --help。附加 -- 就可以了

使用 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

您可以在 preScript、Script 和 postScript 中剖析您的脚本。

我有 git 打字稿库项目的示例:

"predeploy": "yarn build",
"dodeploy": "yarn config set version-git-message ",
"postdodeploy": "yarn version --minor && yarn config set version-git-message 'v%s'"

然后是运行

yarn dodeploy "my custom message"