【问题标题】:Cancel Build if Task Runner Explorer Task Fails如果 Task Runner Explorer 任务失败,则取消构建
【发布时间】:2015-11-17 14:29:24
【问题描述】:

我正在使用 Visual Studio 任务运行程序 (2015) 运行绑定到构建之前的 Gulp 任务。

我已对其进行了设置,以便当 gulp 任务失败时,它会发送退出代码 1,并在最后显示“进程以代码 1 终止”。但是构建仍在继续。

这将取消团队城市中的构建,因此似乎与 Visual Studio 中的 Task Runner 相关联。

如果以非 0 的代码退出,我如何防止构建发生?

【问题讨论】:

    标签: visual-studio gulp task-runner-explorer


    【解决方案1】:

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

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

    设置预构建事件

    对于类库,您可以通过右键单击您的项目并选择 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)Macros for Build Commands 之一。
    • 假设 Gulp 已全局安装:npm install -g gulp。请参阅 jonas.ninjaanswer 了解如何将此安装构建到命令中(或不需要全局依赖的替代方法)。

    【讨论】:

      【解决方案2】:

      我在上面实现了 davidmdem 的解决方案,它很棒......在我的系统上。我在全球范围内安装了gulp,但我的一位同事没有,所以预构建事件会失败。从 Task Runner Explorer 运行 gulp 使用 project-level gulp 安装,但从预构建脚本运行 gulp 使用 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"
      }
      

      【讨论】:

        【解决方案3】:

        我在 gulp 工作的情况下构建 jshint 失败(对我来说已经足够了,对其他人来说可能已经足够了。)我想它可以扩展到包含 Task Runner 中的所有任务。

        这是我使用/做过的...

        根据this 页面,我在我的 project.json 中添加/编辑了它,它与 prebuild 事件挂钩...

          "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 的行添加到您的 package.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"
          }
        }
        

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

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

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

        干杯。

        【讨论】:

          猜你喜欢
          • 2015-09-26
          • 2017-08-31
          • 1970-01-01
          • 1970-01-01
          • 2015-11-06
          • 2018-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多