我有两个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”。
这可能吗?
答案 0 :(得分:6)
可悲的是,postInstall
和postInstallDev
没有区别。您可以创建一个中间脚本来处理差异。例如,如果您有以下内容:
"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);
几个与外围有关的问题......
dependencies
。将它们保持在devDependencies
以避免必须在生产中安装所有这些东西。如上所述在vanilla Node中使用中间脚本将允许您执行此操作。我喜欢使用像这样的postInstall脚本来安装git hook脚本(但也只在开发环境中)。./node_modules/grunt/bin/grunt default
。如果grunt-cli
是dependency
或devDependency
,则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任务。