当部署到Modulus.io(这可能也适用于其他PAAS)时,他们将从packages.json文件安装所需的软件包。作为安装过程的一部分,也可能会调用一些npm脚本。例如postinstall
。但是,这些脚本可能无法运行(或不应运行)生产。这是因为脚本只能在本地使用,或者对生产没有任何意义。如何在部署到PAAS /模块时忽略npm脚本
如何检测环境并执行或不执行某些npm脚本?我可以访问process.env
对象并且适当地处理脚本,或者有更好的方法吗?
当部署到Modulus.io(这可能也适用于其他PAAS)时,他们将从packages.json文件安装所需的软件包。作为安装过程的一部分,也可能会调用一些npm脚本。例如postinstall
。但是,这些脚本可能无法运行(或不应运行)生产。这是因为脚本只能在本地使用,或者对生产没有任何意义。如何在部署到PAAS /模块时忽略npm脚本
如何检测环境并执行或不执行某些npm脚本?我可以访问process.env
对象并且适当地处理脚本,或者有更好的方法吗?
不幸的是,你不能在你的package.json
只为特定的环境定义脚本。
比方说,你在package.json
宣布这样的postinstall
脚本:
{
"scripts": {
"postinstall": "node postInstall.js"
},
}
的“易”方法是添加你关于这个postInstall.js
脚本环境逻辑:
if (process.env.NODE_ENV === 'production') {
// Do not run in production
process.exit(1);
}
如果您在production
环境中运行,您只需指示Node.js尽快使用指定的出口co终止进程例如。
如果您在postinstall
钩子中运行多个脚本,则将所有脚本执行移动到具有相同机制的包装中,以便在特定环境中退出,如果不是,则执行所有其他脚本。
另一种方法,如果你总是在Unix系统上运行的是使用Bash condition直接检查Node.js的环境:
{
"scripts": {
"postinstall": "[ \"$NODE_ENV\" != production ] && node postInstall.js"
},
}
在这种情况下,如果节点环境不production
,那么你”重新运行您的postInstall.js
脚本。您可以将其调整为仅适用于其他条件,例如development
等。
感谢您使用'$ NODE_ENV'提示。我必须稍微改变它,因为它会返回退出状态“1”,因此在部署时暂停执行进一步的执行。它符合以下条件否定条件:''postinstall':“[\”$ NODE_ENV \“= production] || someCmd”'。 – str