如果 Task Runner Explorer 任务失败则取消构建

Cancel Build if Task Runner Explorer Task Fails

我正在使用 visual studio 任务 运行ner (2015) 来 运行 在构建之前绑定到 Gulp 任务。

我已将其设置为当 gulp 任务失败时它会发送退出代码 1,最后它会显示 "Process terminated with code 1." 但是构建会继续。

这将取消在 team city 中的构建,因此 visual studio 中的 Task Runner 似乎是一个问题。

如果构建以非 0 代码退出,我如何才能阻止构建发生?

您说得对,这似乎是任务运行程序的问题。如果 BeforeBuild 任务失败,任务 运行ner 不会与 MSBuild 通信以停止生成。

要解决此问题,您可以 运行 您的 Gulp 任务通过项目的预构建事件而不是通过 Task Runner 绑定。

设置预构建事件

对于 class 个库,您可以通过右键单击您的项目并选择 Properties -> Compile -> Build Events... 来访问生成事件。

对于 Web 项目,它们位于 Properties -> Build Events

这是我用来在预构建事件中调用 Gulp 任务的命令,如果 MSBuild 因失败而退出,它将阻止 运行ning:

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

此命令调用 Gulp 传递工作目录的绝对路径和 gulpfile.js

备注:

  • 我在尝试使用像 gulp my-task 这样更直接的命令时发现了各种上下文和工作目录问题。
  • $(ProjectDir)Macros for Build Commands.
  • 之一
  • 假设全局安装Gulp:npm install -g gulp。请参阅 jonas.ninja's 以了解如何将此安装构建到命令中(或不需要全局依赖项的替代方法)。

我在上面实现了 davidmdem 的解决方案,它非常棒……在我的系统上。我在全局安装了 gulp,但我的一位同事没有安装,因此预构建事件会失败。 运行 gulp 来自 Task Runner Explorer 使用 project-level gulp 安装,但是 运行 gulp 来自 pre -build 脚本使用 global gulp 安装。

为了防止新开发人员没有安装 gulp 的情况,我将 davidmdem 的预构建脚本扩展为以下内容: (gulp --version || npm install -g gulp@3.9.0) & gulp -b $(ProjectDir) --gulpfile $(ProjectDir)gulpfile.js my-task

此命令安装 gulp(版本 3.9.0 以匹配项目级 gulp 安装) 如果尚未安装。现在 gulp 不是您在构建项目之前必须考虑的事情!


(更新:)

解决此问题的另一种方法(在我看来:更好)是使用 npm 作为中介。继续并修改上面的示例,我有一个从命令行调用的 gulp 任务 my-task。这删除了全局 gulp 依赖项,并且在 gulp 失败时仍会正确停止 msbuild。

构建前事件:

npm run build

package.json:

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

我的 jshint 构建失败,但 gulp 正常工作(对我来说已经足够了,也许对其他人来说已经足够了。)我想它可能会扩展到包括 Task Runner 中的所有任务。

这是我used/did...

根据 this 页面,我 added/edited 在我的 项目 .json 中,它与预构建事件挂钩...

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

根据 this 页面,我为我的 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"
  }
}

当出现错误(除了失败的构建)时,这足以让我进一步挖掘 if/as 必要的...

与在 运行 通过命令行或 Task Runner 执行相同任务时我得到的更详细的错误信息相反...

我想这个解决方案可以改进,但我想我会分享,因为我在其他地方没有看到很多关于它的信息。

干杯。