Отменить сборку, если задание проводника задачи Runner

Я использую visual studio task runner (2015) для выполнения задачи Gulp, связанной с ней перед сборкой.

Я настроил его так, чтобы при выполнении задач Gulp он отправил код выхода 1, а в конце он сказал: "Процесс завершен кодом 1." однако сборка продолжается.

Это отменит сборку в городе команды, поэтому кажется, что проблема связана с Run Runner внутри визуальной студии.

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

Ответ 1

Вы правы в том, что это, по-видимому, проблема с задачей Runner. Запуск задачи не связан с MSBuild, чтобы остановить сборку, если задача BeforeBuild завершилась с ошибкой.

Чтобы обойти это, вы можете запустить свою задачу Gulp через событие предварительной сборки проекта, а не через привязки Run Run.

Задайте событие предварительной сборки

Для библиотек классов вы можете получить доступ к событиям Build, щелкнув правой кнопкой мыши ваш проект и выбрав Properties -> Compile -> Build Events....

Для веб-проектов они расположены в Properties -> Build Events.

Вот команда, которую я использовал для вызова задачи Gulp в событии предварительной сборки, что предотвратит запуск MSBuild, если он завершит сбой:

gulp -b $(ProjectDir) --gulpfile $(ProjectDir)gulpfile.js my-task

Эта команда вызывает Gulp передачу абсолютных путей для рабочего каталога и gulpfile.js.

Примечания:

  • Я обнаружил все виды контекста и проблем с рабочим каталогом, пытаясь использовать более строчную команду, например gulp my-task.
  • $(ProjectDir) является одним из Макросов для команд сборки.
  • Предполагается, что Gulp устанавливается глобально: npm install -g gulp. См. jonas.ninja ответ о том, как построить эту установку в команде (или для альтернативы, которая не требуют глобальной зависимости).

Ответ 2

Я реализовал решение davidmdem выше, и это было здорово... в моей системе. У меня был gulp установлен глобально, но один из моих коллег не сделал этого, поэтому событие предварительной сборки потерпит неудачу. Запуск gulp из Проводника Run Runner использует установку уровня проекта gulp, но запуск gulp из pre-build script использует глобальный gulp установка.

Во избежание ситуации, когда новый разработчик не имеет установленного gulp, я расширил davidmdem pre-build script следующим образом: (gulp --version || npm install -g [email protected]) & gulp -b $(ProjectDir) --gulpfile $(ProjectDir)gulpfile.js my-task

Эта команда устанавливает gulp (версия 3.9.0 для соответствия установке gulp на уровне проекта) только в том случае, если она еще не установлена. Теперь gulp - это не то, о чем вам нужно подумать, прежде чем вы сможете построить проект!


(Обновление:)

Альтернативой (на мой взгляд: лучше) решением этой проблемы является использование npm в качестве посредника. Продолжая и изменяя из приведенного выше примера, у меня есть задача gulp my-task, вызываемая из командной строки. Это устранило глобальную зависимость gulp и по-прежнему корректно останавливает msbuild, если gulp не работает.

Событие предварительной сборки:

npm run build

package.json:

"scripts": {
  "build": "gulp min"
}

Ответ 3

У меня есть сбой сборки для jshint с gulp, работающий (достаточно для меня, может быть, достаточно для других). Я предполагаю, что он может быть расширен, чтобы включить все задачи в Task Runner.

Вот что я использовал/сделал...

По эта страница, я добавил/отредактировал это в своем проекте.json, который подключается к prebuild event...

  "scripts": {
    "prebuild": [ "gulp default" ]
  }

По эта страница, я включил следующее для моей задачи jshint...

// =============================
// jsHint - error detection
// =============================
gulp.task("jshint", function () {
    var jshGlobals = [
        '$',
        'jQuery',
        'window',
        'document',
        'Element',
        'Node',
        'console'
    ];

    gulp.src([paths.jsFiles, norefs])
        .pipe(jshint({
            predef: jshGlobals,
            undef: true,
            eqnull: true
        }))
        .pipe(jshint.reporter('jshint-stylish'))
        .pipe(jshint.reporter('fail'))
});

Последние две строки являются наиболее значимыми. Вам понадобится npm install jshint-stylish, если у вас его еще нет.

В качестве альтернативы, для jshint-stylish вы можете позволить VS обрабатывать его для вас. Добавьте строку для jshint-stylish, как показано ниже, в свой пакет.json...

{
  "name": "ASP.NET",
  "version": "0.0.0",
  "devDependencies": {
    "es6-promise": "~3.1.2",
    "gulp": "^3.8.11",
    "del": "^2.2.0",
    "jshint": "~2.9.1",
    "jshint-stylish": "~2.1.0",
    "gulp-jshint": "~2.0.0",
    "gulp-flatten": "~0.2.0",
    "gulp-rename": "~1.2.2",
    "gulp-cssmin": "0.1.7",
    "gulp-uglify": "1.2.0",
    "gulp-postcss": "~6.1.0",
    "autoprefixer": "~6.3.3"
  }
}

Это дает мне это, когда есть ошибка (в дополнение к неудачной сборке), которая достаточна для того, чтобы я мог копать дальше, если/при необходимости... vs окно списка ошибок после сборки

В отличие от более подробной информации об ошибке, которую я получаю при выполнении той же задачи через командную строку или Run Run Run... gulp вывод задачи по умолчанию через cmd.exe

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

Приветствия.