Отправить параметры в jshint reporter в Gulp

У меня есть Gulpfile с jshint, настроенным на использование jshint-stylish reporter. Мне нужно передать параметр verbose репортеру, чтобы отображались коды предупреждений. Можно ли это сделать с помощью Gulp?

Текущий мой gulpfile.js выглядит следующим образом:

var gulp = require('gulp');
var jshint = require('gulp-jshint');
var compass = require('gulp-compass');
var path = require('path');
require('shelljs/global');

var jsFiles = ['www/js/**/*.js', '!www/js/libraries/**/*.js', 'www/spec/**/*.js', '!www/spec/lib/**/*.js'];
var sassFiles = 'www/sass/*.scss';

gulp.task('lint', function () {
    return gulp
        .src(jsFiles)
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish'));
});

gulp.task('compass', function () {
    gulp.src(sassFiles)
        .pipe(compass({
            project: path.join(__dirname, 'www'),
            css: 'css',
            sass: 'sass',
            image: 'img',
            font: 'fonts'
        })).on('error', function() {});
});

var phonegapBuild = function (platform) {
    if (!which('phonegap')) {
        console.log('phonegap command not found')
        return 1;
    }
    exec('phonegap local build ' + platform);
};

gulp.task('build:android', ['lint', 'compass'], function () {
    phonegapBuild('android');
});

gulp.task('build:ios', ['lint', 'compass'], function () {
    phonegapBuild('ios');
});

gulp.task('watch', function() {
    gulp.watch(jsFiles, ['lint']);
    gulp.watch(sassFiles, ['compass']);
});

gulp.task('default', ['lint', 'compass']);

person Michał Zalewski    schedule 12.03.2014    source источник


Ответы (4)


Ну, это, плюс тот факт, что вывод стильного репортера плохо читается в Windows из-за темноты синего текста, поэтому мне приходится продолжать вручную менять цвет после его установки, заставило меня что-то предпринять Это. Так что, надеюсь, вам больше повезет с этим репортером, о котором я только что написал:

https://github.com/spiralx/jshint-summary

Вы в основном используете это так;

var summary = require('jshint-summary');

// ...

  .pipe(jshint.reporter(summary({
    verbose: true,
    reasonCol: 'cyan,bold',
    codeCol: 'green'
  })

и функция summary инициализирует функцию, переданную JSHint, с этими настройками — см. страницу на Github для получения дополнительной документации.

У него есть несколько очень простых тестов, и библиотека gulpfile.js использует его для отображения собственного вывода JSHint :)

person spiralx    schedule 31.03.2014

Как насчет того, чтобы использовать аналогичную технику, как вы уже делали с телефонным разрывом?

var jshint = function (parameter) {
    // todo: define paths with js files, or pass them as parameter too
    exec('jshint ' + paths + ' ' + parameter);
};
person zgorawski    schedule 18.03.2014
comment
Мне нравится использовать jshint как библиотеку javascript (чтобы импортировать ее), а не как exec, но в этом случае все выглядит нормально, и я не нахожу другого варианта. - person Michał Zalewski; 18.03.2014

На основе https://github.com/wearefractal/gulp-jshint/blob/master/index.js#L99 похоже, что gulp-jshint не облегчает передачу генератору отчетов больше, чем имя, если вы загружаете его строкой. Хотя это кажется простой вещью для расширения. Я подгоню вас к пул-реквесту. :D

В качестве альтернативы попробуйте что-то вроде этого:

var stylish = require('jshint-stylish');

// ...

.pipe(jshint.reporter(stylish(opt)));

Я почти уверен, что у меня неправильный синтаксис, но это может вас расстроить.

person robrich    schedule 18.03.2014

Это раздражает и затрудняет использование любого приличного репортера в рамках существующей структуры. Я придумал этот лайфхак для Стильного репортера, сейчас он у меня в gulpfile.js:

function wrapStylishReporter(reporterOptions) {
  var reporter = require(stylish).reporter,
    reporterOptions = reporterOptions || {};

  var wrapped = function(results, data, config) {
    var opts = [config, reporterOptions].reduce(function(dest, src) {
      if (src) {
        for (var k in src) {
          dest[k] = src[k];
        }
      }
      return dest;
    }, {});

    reporter(results, data, opts);
  };

  return jshint.reporter(wrapped);
}

А затем для самого определения задачи:

gulp.task('lint', function() {
  return gulp.src('+(bin|lib)/**/*.js')
    .pipe(jshint())
    .pipe(wrapStylishReporter({ verbose: true }))
    .pipe(jshint.reporter('fail'));
});

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

person spiralx    schedule 27.03.2014
comment
Я пробовал аналогичный способ использования оболочки, но это нарушает мою задачу просмотра. Когда я запускаю gulp watch и делаю какую-то ошибку в коде, то lint ее находит, но задача lint никогда не заканчивается. - person Michał Zalewski; 28.03.2014