2015-10-18 3 views
4

Я пытаюсь запустить мое приложение в Sails.js, но не могу пройти мимо задач grunt. Это ошибка, я получаю:Невозможно поместить приложение 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' 

]; 

Я не уверен, что еще будет причиной этого, какие-либо предложения? Я использую Sails версии 0.11.0

+0

Какой порт вы используете для производства? Если это порт 80, посмотрите, есть ли у него другие сервисы (nginx, apache и т. Д.) И убейте их. Также стоит попытаться поднять паруса как root, чтобы найти, связано ли это с разрешением. – galactocalypse

+0

Я запускаю как root и его порт 443 для SSL. Хотя он все равно не работал на 80. Нет установленных apache или nginx. –

+0

попробуйте запустить grunt uglify: dist by – joncodo

ответ

4

Я просто имел такую ​​же проблему, и это было только, что тайм-аут не был достаточно большим, я должен был сделать это в моей конфигурации/local.js файл:

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

Возвращаясь к этому через год, я бы сказал, что вы должны запускать grunt или grunt buildProd с помощью флага --verbose чтобы понять, почему это так долго бежит. Также может случиться, что на этом порту уже запущено что-то еще. Вы можете сделать паруса --port = 1234 для проверки на другом порту – joncodo

1

Я только что опубликовал ту же самую проблему в github, а затем проверил исходный код. Поэтому я прочитал хрюканье, чтобы понять, что происходит. И получается, что в режиме default хрюкающий крючок запускает обратный вызов сразу после запуска grunt, но для режима prod он запускается только тогда, когда grunt завершил все задачи.

Существует следующий комментарий в исходном коде:

центибар - необязательно, пожары, когда задача Grunt была начата (непроизводственные) или готовые (производство)

Так что если есть что-нибудь наблюдение (например, используя watch в браузере) в prod, задача grunt никогда не выйдет, и поэтому хрюкать крюк всегда будет тайм-аут. Но даже если ничто не наблюдает, начинать задачу grunt занимает намного больше времени, заканчивая все задачи, и это объясняет, почему мы не видим проблемы, когда не в режиме производства. Поскольку модификация оригинального крючка для хрюка не самая лучшая идея (она живет в node_modules), лучше всего увеличить (возможно, резко) опцию _hookTimeout и убедиться, что вышли из задачи grunt (для этого ее можно запускать отдельно с grunt prod) ,

Смежные вопросы