2015-10-18 49 views
4

我試圖將我的應用程序投入Sails.js的生產環境,但無法通過繁重的任務。這是我收到的錯誤:無法將Sails.js應用程序投入生產

error: Error: The hook `grunt` is taking too long to load. 
Make sure it is triggering its `initialize()` callback, or else set 
`sails.config.grunt._hookTimeout to a higher value (currently 20000) 
at tooLong [as _onTimeout] 
    (/usr/local/lib/node_modules/sails/lib/app/private/loadHooks.js:92:21) 
    at Timer.listOnTimeout (timers.js:110:15) 

我有大幅提升sails.config.grunt._hookTimeout仍然過程尚未完成。在生產或開發的輸出運行sails debug

Grunt :: Error: listen EADDRINUSE 
    at exports._errnoException (util.js:746:11) 
    at Agent.Server._listen2 (net.js:1156:14) 
    at listen (net.js:1182:10) 
    at Agent.Server.listen (net.js:1267:5) 
    at Object.start (_debugger_agent.js:20:9) 
    at startup (node.js:86:9) 
    at node.js:814:3 

我覺得很奇怪,在開發模式下,一切工作正常,但它不是在生產的情況。包含的文件非常大,如角度,時刻和其他模塊。這是jsFilesToInject的樣子:

var jsFilesToInject = [ 

// Load sails.io before everything else 
'js/dependencies/sails.io.js', 

'js/dependencies/angular.min.js', 
'js/dependencies/moment.min.js', 
'js/dependencies/angular-ui-router.min.js', 
'js/dependencies/angular-sails.min.js', 
'js/dependencies/angular-moment.min.js', 
'js/dependencies/angular-animate.min.js', 
'js/dependencies/angular-aria.min.js', 
'js/dependencies/angular-material.min.js', 

// All of the rest of your client-side js files 
// will be injected here in no particular order. 
'js/**/*.js' 

]; 

我不知道還有什麼會導致此,有什麼建議?我使用的版本揚帆0.11.0

+0

您使用什麼端口進行生產?如果它是80端口,看看是否有其他服務使用它(nginx,apache等)並殺死它們。同樣值得嘗試以root身份提升sails以查找它是否與權限相關。 – galactocalypse

+0

我以root身份運行,並在端口443上運行SSL。無論如何,它仍然無法使用80。沒有安裝apache或nginx。 –

+0

嘗試運行grunt uglify:dist本身 – joncodo

回答

4

我只是有這個同樣的問題,它只是超時是不夠大,我不得不把這個在我的配置/ local.js文件:

module.exports = { 
    hookTimeout: 120000 
}; 
+0

在一年後回到這裏,我會說你應該運行帶有--verbose標誌的grunt或grunt buildProd看看爲什麼這需要很長時間才能運行。也可能是其他的東西已經在那個端口上運行了。你可以做一個帆升降機--port = 1234在另一個港口進行測試 – joncodo

1

我剛剛在github上發佈了相同的問題,然後檢出了源代碼。所以我通過咕嚕聲來了解發生了什麼。事實證明,在default模式下,grunt掛鉤在grunt啓動後立即觸發回調,但對於prod模式,只有在grunt完成所有任務後纔會觸發。

有一個在源代碼如下評論:

CB - 可選,火災時,繁重的任務已經啓動(非生產)或成品(生產)

所以,如果在prod中有任何正在觀看的東西(例如在browserify中使用watch),grunt任務將永遠不會退出,因此grunt鉤子將始終超時。但即使沒有什麼東西在看,開始咕嚕的任務需要更長的時間才能完成所有的任務,這就解釋了爲什麼我們不在生產模式下看不到問題。 由於修改原始grunt鉤子並不是最好的主意(它生活在node_modules),所以最好的做法是增加(可能顯着)_hookTimeout選項並確保grunt任務退出(爲此可以與grunt prod分開運行) 。

相關問題