【问题标题】:npm run: how to pass parameter and replace placeholder by param in script callnpm run:如何在脚本调用中通过参数传递参数和替换占位符
【发布时间】:2019-07-26 16:58:29
【问题描述】:

我想在我的 package.json 中定义一个 scripts 条目以简化多​​个环境的构建。

在脚本执行中,我需要将$1(或占位符所需的任何语法)替换为我将传递给npm run build-script 的参数,例如--env=prod 或更简单的--prod。我怎样才能做到这一点?我在这里找到的其他问题和答案并没有帮助我解决问题。

"scripts": { 
  "build-for": "ng build --output-path=../../web/admin-v2 --env=$1 --base-href=\"/admin-v2/\""
}

【问题讨论】:

标签: npm npm-scripts


【解决方案1】:

我经常为这种场景创建一个实用程序节点脚本,并通过package.jsonscripts 部分调用它。


build-for.js

var nodeCLI = require('shelljs-nodecli');

var env = '--env=foo'; // <-- Default env flag/value when no arg provided.

if (process.argv.indexOf('--prod') !== -1) {
  env = '--env=prod';
}

// Check for other possible env values
if (process.argv.indexOf('--quux') !== -1) {
  env = '--env=quux';
}

// Run the ng build command
nodeCLI.exec('ng', 'build', '--output-path=../../web/admin-v2', env, '--base-href=\"/admin-v2/\"');

build-for.js 利用节点 process.argv 确定通过 CLI 传递的参数/标志,然后调用 ng 命令(当前在 package.json 中定义的命令) 使用 @987654322 @。

npm i -D shelljs-nodecli

让我们假设build-for.js 保存在项目根目录中名为.scripts 的隐藏文件夹中;那么package.jsonscripts 部分将定义如下:

package.json

{
  ...
  "scripts": {
    "build-for": "node ./.scripts/build-for"
  },
  ...
}

运行脚本

通过运行调用 npm 脚本:

npm run build-for -- --prod

注意参数--prod之前的特殊--必须包含here的解释

从 npm@2.0.0 开始,您可以在执行脚本时使用自定义参数。 getopt 使用特殊选项 -- 来分隔选项的结尾。 npm 会将 -- 之后的所有参数直接传递给您的脚本:

鉴于build-for.js 中当前的逻辑 - 例如,当没有传递参数时:

npm run build-for

...env 标志将设置为 --env=foo

运行以下:

npm run build-for -- --quux

...将导致env 标志将设置为--env=quux


警告

我还没有完全测试build-for.js,所以你可能会发现你不需要转义以下命令的这部分'--base-href=\"/admin-v2/\"' 中的双引号nodeCLI 可以处理你。)

// Run the ng build command
nodeCLI.exec('ng', 'build', '--output-path=../../web/admin-v2', env, '--base-href=\"/admin-v2/\"');

【讨论】:

  • 感谢您的回答,将尝试一下。 npm 似乎没有标准机制来满足这种相当普遍的需求,这让人有点失望。
  • 我的荣幸 connexo。我也感觉到你的失望。我相信此功能已被多次请求,例如this。但是,相关部分是项目所有者reply。它声明:“我们不支持将 args 传递到脚本中间,抱歉。”。因此,我的答案中提供了解决方法。
【解决方案2】:

不完全是您要查找的内容,但您可以使用环境变量并内联提供它们:

package.json 脚本: "&lt;script&gt;": "echo ${ENV1} ${ENV2}"

像这样运行: ENV1=a ENV2=b npm run &lt;script&gt;

$ npm run <script>
a b

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2023-03-05
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2011-10-10
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多