将命令行 -- 参数传递给 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。父脚本运行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

提前感谢!

在 mac 上,我正在使用:

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

然后我称之为yarn benchmark editor其中editor是我的参数。

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

当我过去需要这个时,我已经制作了我自己的dev.js脚本,该脚本由我的package.json调用,并提取出环境变量。

实现此目的的一种简单方法是使用参数扩展编写一个内联 Bash 函数$@

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

使用yarn dev foo bar调用上述内容将运行node index.js foo bar,然后将结果作为 democat通过管道传输。
您可以将命令附加到开头和结尾,只需记住这里需要 semis。

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

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

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

例如

至于现在,使用yarn 1.22.4你可以做yarn exec tsc -- --help。附加--就可以解决问题

像这样做。因为纱线本质上会提供参数。

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

alpha 仅适用于Mac/Linux,不适用于Win10.这很糟糕。

测试版适用于Mac/LinuxWin10

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

如果您使用的是 yarn 1.x,这可能会帮助您: https://github.com/yarnpkg/yarn/issues/5207#issuecomment-690583826

注意:它仅适用于shell,不适用于Windows :)

例如,我想将参数添加到标准版本消息(-m(:

我把它从

"release:beta": "yarn test && standard-version --prerelease beta && git push --follow-tags",

"release:beta": "f() { yarn test && standard-version --prerelease beta -m "$@" && git push --follow-tags; }; f",

为您的命令创建一个包装函数,这样您就可以控制参数的位置:

"scripts": {
"audit-page": "wrapper() { lighthouse $1 --chrome-flags='--headless'; }; wrapper "
},

然后我可以使用:

yarn audit-page https://example.com

它会导致以下调用:

$ wrapper() { lighthouse $1 --chrome-flags='--headless'; }; wrapper  https://example.com

否则lighthouse抱怨,因为它期望在选项之前使用 URL

我使用了文件解决方法,但后来发现我可以在参数之前使用--将参数附加到命令中。 因此,使用package.json文件中的正常命令,然后yarn run cmd -- --param value我让它工作。

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

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

"predodeploy": "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"       

Yarn "modern" (v2+( 支持传递参数:

"scripts": {
"args": "echo "second $1 first $0 all $@""

输出:

$ yarn run args 1 2
second 2 first 1 all 1 2