将命令行——参数传递给 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
如您所见,选项被转发到底层脚本,一切都按预期工作。
我的问题是我无法将 --results
从 yarn 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
/Linux
和 Win10
。
我在这里发布了一些东西(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
您可以在 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"
我有一个 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
如您所见,选项被转发到底层脚本,一切都按预期工作。
我的问题是我无法将 --results
从 yarn 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
/Linux
和 Win10
。
我在这里发布了一些东西(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 )
实现此目的的一种直接方法是编写 $*
:
"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
您可以在 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"