2014-02-07 54 views
3

我有兩個heroku node.js應用程序,一個用於產品,一個用於開發,另外我還有一個Gruntfile,其中包含dev-和prod特定的任務。我知道你可以設置package.json來運行grunt作爲npm的postinstall鉤子,但是你可以指定不同的任務來運行,具體取決於你所在的環境嗎?heroku - npm postinstall腳本根據環境運行咕嚕任務

這裏就是我的package.json的相關部分看起來像至今:

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

而不是運行咕嚕每次默認情況下,我會愛跑「咕嚕生產」如果NODE_ENV是生產等。

這可能嗎?

+0

我也在想這個。在我的情況下,我只是想在Heroku上安裝時不運行任務。 –

回答

2

由於某種原因,我的開發環境從未運行我的「開發」if語句。我給Heroku支持發了一張票,這是他們的回答:「默認情況下,你的環境在slug編譯期間是不可用的。如果你想使它可用,你可以啓用一個名爲」user-env-compile「請參閱以下文章: http://devcenter.heroku.com/articles/labs-user-env-compile「。很高興知道。所以,我使用heroku-buildpack-nodejs-grunt buildpack去了另一條路線,然後創建了一個heroku:development grunt任務。

+0

你真的應該在你的問題中提到Heroku ... – qubyte

+0

它總是作爲標籤出現在問題的第一行;) –

6

很遺憾,沒有什麼區別,比如postInstallpostInstallDev。儘管如此,你可以創建一箇中間腳本來處理差異。例如,如果您有以下幾點:

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

然後在這個腳本,你可以從那裏檢查環境變量和執行正確的步兵任務:

// 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以避免必須在生產中安裝所有這些東西。在上面的香草節點中有一箇中間腳本可以讓你做到這一點。我喜歡使用這樣的postInstall腳本來安裝git鉤子腳本(但也僅限於開發環境)。
  • 您不必使用./node_modules/grunt/bin/grunt default。如果grunt-clidependencydevDependency,npm知道在哪裏看,grunt default將正常工作。
+0

這是一個好主意。我會嘗試一下,謝謝。我會發布我的結果... –

+0

所以我試了這個。請參閱下面的答案。 –

+0

是的,對不起 - 我在身體中提到它,但你說得對,我應該把它作爲問題標題的一部分。 –