有条件地运行 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"
所以为了测试env
s,你可以这样做:
"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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 vue 模板脚本中有条件地调用 apollo 客户端?