2016-07-24 43 views
1

当部署到Modulus.io(这可能也适用于其他PAAS)时,他们将从packages.json文件安装所需的软件包。作为安装过程的一部分,也可能会调用一些npm脚本。例如postinstall。但是,这些脚本可能无法运行(或不应运行)生产。这是因为脚本只能在本地使用,或者对生产没有任何意义。如何在部署到PAAS /模块时忽略npm脚本

如何检测环境并执行或不执行某些npm脚本?我可以访问process.env对象并且适当地处理脚本,或者有更好的方法吗?

回答

3

不幸的是,你不能在你的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等。

+0

感谢您使用'$ NODE_ENV'提示。我必须稍微改变它,因为它会返回退出状态“1”,因此在部署时暂停执行进一步的执行。它符合以下条件否定条件:''postinstall':“[\”$ NODE_ENV \“= production] || someCmd”'。 – str