2014-01-14 3 views
13

В настоящее время я экспериментирую с преобразованием файлов Grunt в файлы Gulp. Моя первая попытка была с довольно простым файлом, который просто запускает JSHint и Mocha и имеет режим просмотра. Мой первый результат был довольно ... ну ... разочарованием.От Grunt to Gulp

я столкнулся с рядом проблем, и я надеюсь, что есть способ решить их:

  • я понял, что Глоток выполняет все задачи асинхронно. Если я хочу дождаться завершения задачи, документация подскажет мне использовать обратный вызов, обещание или вернуть поток. Но как мне это сделать с gulp-mocha и gulp-jshint? Поддерживают ли эти плагины это?
  • Ошибка gulp-jshint не провалилась. Как сообщить Gulp прекратить работу, если gulp-jshint не удалось?
  • Использование режима watch, как описано в руководстве по началу работы Gulp, привело к ошибке Too many open files при запуске gulp. Любая идея, что может быть неправильным?

(Пожалуйста, обратите внимание, что я намеренно не указать исходный код здесь, как и первые два вопроса общие вопросы, а последний относится к файлу по умолчанию.)

Любая помощь по этому вопросу?

+1

Это не прямой ответ. Вы должны стараться, насколько это возможно, не бороться с асинхронным поведением gulp. В большинстве случаев вы можете просто запускать кучу задач в одном файле подряд. В таком случае вы должны сделать одну задачу и не полагаться на временные файлы. –

+3

Вопрос не направлен на борьбу с асинхронным выполнением, но касается очень законной потребности в зависимостях задач (см. Https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulptaskname-deps- fn) - и как заставить jshint действительно терпеть неудачу. OP даже не упомянул временные файлы ... –

+2

Smashing Magazine недавно опубликовал удобный справочник по [используя Gulp] (http://www.smashingmagazine.com/2014/06/11/building-with-gulp), вы можете так же полезен, как и я. – idleberg

ответ

10

Что касается зависимостей задач, самым простым решением является возврат потока глотком от задачи, и зависит по этой задаче.

В приведенном ниже коде, если задача «сервер» не возвращает поток, он будет выполняться асинхронно, в результате чего задача «обслуживать» пытается запустить сервер с использованием несуществующего файла.

gulp.task('server', function() { 
    return gulp.src('server/**/*.coffee') 
     .pipe(coffeescript()) 
     .pipe(gulp.dest('./dist/')); 
}); 

var expressServer; 

gulp.task('serve', ['server'], function() { 
    var apiServer = require('./dist/server'); 
    expressServer = apiServer(function (server) { 
    server.use(livereload({ 
     port: livereloadport 
    })); 

    }); 

    expressServer.listen(serverport); 

    //Set up your livereload server 
    lrserver.listen(livereloadport); 
}); 
4

Для "остановки и не" часть:

Вот функциональный пример с jshint:

var reporter = require('jshint-stylish'); 
var jshintRc = readJSON('.jshintrc'); 

// Implement asynchronous support returning the stream 
gulp.task('myhinter', function() { 
    // All js in src 
    return gulp.src('./src/*.js') 
    // options from file 
    .pipe(jshint(jshintRc)) 
    // like stylish reporter 
    .pipe(jshint.reporter(reporter)) 
    // Our turn! 
    .pipe(map(function (file, cb) { 
     // Notify the callback "true" if it failed on the file 
     cb(!file.jshint.success, file); 
    })); 
}) 

// Now, define thattask to depend on myhinter 
gulp.task('thattask', ['myhinter'], function(e) { 
    console.warn('thattask is executing'); 
}); 

thattask зависит от успеха задачи myhinter.

В свою очередь myhinter делает jshint на файлах, репортер использует стильный и не работает, если хотя бы один файл не дал намека.

Здесь это реализовано путем возврата потока из задачи myhinter.

Вы можете увидеть больше о том, что в документации Orchestrator: https://github.com/robrich/orchestrator

Я не использую мокко, но рассмотрим позже, чтобы посмотреть, как это сделать.

О слишком большом открывшемся файле, находятся на OSX? Если это так, возможно, см. this here, если это поможет.

+0

В связи с первым вопросом, как резюме: по крайней мере, на сегодняшний день (с зависимостями задачи) идея состоит в том, чтобы разделить задачи 'jshint',' mocha' и '' build', каждая в зависимости от предыдущей с ' gulp.task ('name', ['dependency'], function() {}); '. – smhg

0

Я решил «Слишком много открытый файл ..», добавив в моем .bash_profile следующую строку:

ulimit -n 10480 
+1

Я не уверен, что увеличение лимита является приемлемым ответом для некоторых, что, таким образом, представляет собой угрозу безопасности. Я думаю, что в действительности в какой-то момент глотку нужно «отпустить» поток файлов. Один из способов сделать это - связать некоторые из ваших задач с глотанием с помощью сценариев оболочки. Да, это кажется странным, но какова альтернатива в глотке? Она будет или npm задачи/сценарии через npm run. – Nick

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