有条件地运行 npm 脚本

Posted

技术标签:

【中文标题】有条件地运行 npm 脚本【英文标题】:Running npm scripts conditionally 【发布时间】:2013-09-16 23:34:26 【问题描述】:

我有 2 个主要的构建配置 - dev 和 prod。 我将更新推送到运行 npm install --production 以安装我的应用程序的 heroku 服务器。 在 package.json 我有以下部分:

"scripts": 
    "postinstall": "make install"

运行一个负责丑化代码和其他一些小事情的 make 文件。

但是,我不需要在开发模式下运行这个 makefile。有什么方法可以有条件地使用 npm 运行脚本?..

谢谢!

【问题讨论】:

【参考方案1】:

您可以在package.json 中定义类似的内容(我相信if 语句有更好的简写方式。)

"scripts": 
    "postinstall":"if test \"$NODE_ENV\" = \"production\" ; then make install ; fi "

然后,当您使用生产标志执行 npm 时,就像您所说的那样,您已经这样做了

npm install --production

它将执行您的make install,因为它将设置$NODE_ENV = production


当我需要有条件地执行某些任务时,我将环境变量传递给脚本/程序,它负责处理该逻辑。我像这样执行我的脚本

NODE_ENV=dev npm run build

package.json 中,您将启动一个脚本/程序

"scripts": 
    "build":"node runner.js"

它将检查环境变量的值以确定要做什么。在runner.js 中,我执行以下操作

if (process.env.NODE_ENV)
  switch(process.env.NODE_ENV)
    ....
  

【讨论】:

如您所见,也可以更简洁地执行条件:"postinstall": "if [ test = \"production\" ]; then make install; fi" 是跨平台的吗? @SuperUberDuper 不,它不会与 Windows DOS 兼容。它必须根据运行 npm 脚本的平台进行相应调整。 DOS 也有条件。 嗨,詹姆斯,这个有条件任务的文档在哪里,因为我找不到它们,我需要做这样的事情 "postinstall":"if test \"$NODE_ENV\" = \ "production\" ; 然后 --env=prod ; else --env=qa fi " 我在 prod 和 qa 之间选择 @Milo 条件只是 bash 条件表达式。【参考方案2】:

供日后参考。

对于条件 npm 脚本,您可以使用跨平台的基本逻辑运算符来创建类似 if 的语句(||&&)。 我遇到需要运行脚本来只在任何机器上生成一次帮助程序。您可以通过使用process.exit() 代码使用内联javascript 来执行此操作。

"scripts": 
    "build":"(node -e \"if (! require('fs').existsSync('./bin/helpers'))process.exit(1) \" || npm run setup-helpers) && npm run final-build-step"

所以为了测试envs,你可以这样做:

"scripts": 
    "build":"node -e \"if (process.env.NODE_ENV === 'production')process.exit(1) \" || make install"

【讨论】:

【参考方案3】:

您不能在 devDependencies 下的 .json 中添加另一个部分吗?然后,如果您执行 npm install ,它将安装 devDependincies 下指定的软件包,而 npm install --production 将安装常规依赖项。

【讨论】:

【参考方案4】:

我鼓励您采取不同的策略来丑化您的代码。看看connect-browserify 或更强大的asset-rack。

这些可以在 Express 服务器启动时自动丑化您的代码,而不是在安装时。您可以将它们配置为在开发和生产中执行不同的操作。

【讨论】:

来自connect-browserify github页面:You should never use this middleware in production — use nginx for serving pre-built bundles to a browser. 感谢您的更正。然而,Asset Rack 非常适合在生产环境中使用。

以上是关于有条件地运行 npm 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地评估 bash 脚本

如何在我的 vue 模板脚本中有条件地调用 apollo 客户端?

在bash中运行条件脚本[重复]

如何使用 WinPTY 运行 npm 脚本?

为啥在 npm install 之后 npm 正在运行准备脚本,我该如何停止它?

将参数传递给npm运行脚本