我有 2 个主要的构建配置 - dev 和 prod。我将更新推送到运行 npm install --production 以安装我的应用程序的 heroku 服务器。在 package.json 我有以下部分:
"scripts": {
"postinstall": "make install"
}
它运行一个make文件,负责丑化代码和其他一些小事情。
但是,我不需要在开发模式下运行这个 makefile。有没有办法用 npm 有条件地运行脚本?
谢谢!
您可以在您的中定义类似的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){
....
}
}
备查。
对于条件 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"
}
我会鼓励你对丑化你的代码采取不同的策略。看看connect-browserify或者更强大的 assets -rack。
这些可以在 Express 服务器启动时自动丑化您的代码,而不是在安装时。您可以将它们配置为在开发和生产中做不同的事情。
您不能在 devDependencies 下的 .json 中添加另一个部分吗?然后,如果您执行 npm install ,它将安装 devDependincies 下指定的软件包,而 npm install --production 将安装常规依赖项。