heroku - npm postinstall脚本根据enviro运行grunt任务

时间:2014-02-07 17:41:05

标签: node.js heroku gruntjs npm

我有两个heroku node.js应用程序,一个用于prod,一个用于dev,我还有一个具有dev和prod特定任务的Gruntfile。我知道你可以设置package.json来运行grunt作为npm的postinstall挂钩,但是你可以指定不同的任务来运行,具体取决于你所在的enviro吗?

到目前为止,我的package.json的相关部分是这样的:

"scripts": {
    "postinstall": "./node_modules/grunt/bin/grunt default"
},

如果NODE_ENV是制作等,我不想每次都运行grunt默认值,而是喜欢运行“grunt production”。

这可能吗?

2 个答案:

答案 0 :(得分:6)

可悲的是,postInstallpostInstallDev没有区别。您可以创建一个中间脚本来处理差异。例如,如果您有以下内容:

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

然后在这个脚本中你可以检查环境变量并从那里执行正确的Grunt任务:

// postInstall.js
var env = process.env.NODE_ENV;

if (env === 'development') {
    // Spawn a process or require the Gruntfile directly for the default task.
    return;
}

if (env === 'production') {
    // Spawn a process or require the Gruntfile directly to the prod task.
    return;
}

console.error('No task for environment:', env);
process.exit(1);

几个与外围有关的问题......

  • 尽量不要让Grunt和co。为dependencies。将它们保持在devDependencies以避免必须在生产中安装所有这些东西。如上所述在vanilla Node中使用中间脚本将允许您执行此操作。我喜欢使用像这样的postInstall脚本来安装git hook脚本(但也只在开发环境中)。
  • 您不必使用./node_modules/grunt/bin/grunt default。如果grunt-clidependencydevDependency,则npm知道要查看的位置,grunt default将正常工作。

答案 1 :(得分:2)

出于某种原因,我的开发环境从未运行过我的“开发”if语句。我向Heroku支持发了一张票,这就是他们的答案:“默认情况下,在slug编译期间你的环境不可用。如果你想让它可用,你可以启用一个名为”user-env-compile“的实验性功能。有关详细信息,请参阅以下文章: http://devcenter.heroku.com/articles/labs-user-env-compile“。很高兴知道。所以,我使用heroku-buildpack-nodejs-grunt buildpack进入另一条路线,然后创建一个heroku:development grunt任务。