有条件地运行npm脚本

Pro*_*ome 12 heroku node.js npm

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

"scripts": {
    "postinstall": "make install"
}
Run Code Online (Sandbox Code Playgroud)

运行一个make文件,负责解释代码和其他一些小问题.

但是,我不需要在开发模式下运行此makefile.有没有办法用npm有条件地运行脚本?

谢谢!

Jam*_*hoi 29

你可以在你的内容中定义这样的东西package.json(我确信这是一个更好的简写if.)

"scripts": {
    "postinstall":"if test \"$NODE_ENV\" = \"production\" ; then make install ; fi "
}
Run Code Online (Sandbox Code Playgroud)

然后当你执行npm生产标志时,就像你所说的那样

npm install --production
Run Code Online (Sandbox Code Playgroud)

它会执行你的,make install因为它会设置$NODE_ENV = production


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

NODE_ENV=dev npm run build
Run Code Online (Sandbox Code Playgroud)

package.json,你会启动一个脚本/程序

"scripts": {
    "build":"node runner.js"
}
Run Code Online (Sandbox Code Playgroud)

这将检查环境变量的值以确定要执行的操作.在runner.js我做类似以下的事情

if (process.env.NODE_ENV){
  switch(process.env.NODE_ENV){
    ....
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 那是跨平台吗? (4认同)

Rob*_*fan 14

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

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

因此,对于测试env,您可能会这样做:

"scripts": {
    "build":"node -e \"if (process.env.NODE_ENV === 'production'){process.exit(1)} \" || make install"
}
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我来说跨平台工作的解决方案;它应该被选为正确答案。 (2认同)
  • 由于跨平台支持,你得到了我的投票。 (2认同)