28

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

"scripts": {
    "postinstall": "make install"
}

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

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

谢谢!

4

4 回答 4

54

您可以在您的中定义类似的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){
    ....
  }
}
于 2016-02-24T06:07:35.837 回答
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"
}

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

"scripts": {
    "build":"node -e \"if (process.env.NODE_ENV === 'production'){process.exit(1)} \" || make install"
}
于 2021-10-06T06:09:05.347 回答
1

我会鼓励你对丑化你的代码采取不同的策略。看看connect-browserify或者更强大的 assets -rack

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

于 2013-09-13T01:52:38.037 回答
1

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

于 2013-09-12T23:42:05.313 回答