部署到 PAAS/Modulus 时如何忽略 npm 脚本

How to ignore npm scripts when deploying to PAAS/Modulus

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

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

不幸的是,您不能在 package.json 中只为特定环境定义脚本。

假设您有一个 postinstall 脚本在 package.json 中这样声明:

{
  "scripts": { 
    "postinstall": "node postInstall.js" 
  },
}

"easy" 方法是在这个 postInstall.js 脚本中添加关于环境的逻辑:

if (process.env.NODE_ENV === 'production') {
  // Do not run in production
  process.exit(1);
}

如果您 运行 在 production 环境中,您只需指示 Node.js 使用指定的退出代码尽快终止进程。

如果您在 postinstall 挂钩中 运行 有多个脚本,您也可以将所有脚本的执行移动到具有相同机制的包装器中以在特定环境中退出,如果没有,则执行所有其他脚本。

如果您总是 运行 在 Unix 系统上,另一种方法是使用 Bash condition:

直接检查 Node.js 环境
{
  "scripts": { 
    "postinstall": "[ \"$NODE_ENV\" != production ] && node postInstall.js"
  },
}

在这种情况下,如果节点环境不是 production,那么您就是 运行 您的 postInstall.js 脚本。您可以将其调整为仅在 development 等其他条件下