18

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

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

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

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

4

3 回答 3

18

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

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

设置预构建事件

对于类库,您可以通过右键单击您的项目并选择来访问构建事件Properties -> Compile -> Build Events...

对于 Web 项目,它们位于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答案,了解如何将此安装构建到命令中(或不需要全局依赖的替代方案)。
于 2015-11-20T22:26:10.003 回答
2

我在上面实现了 davidmdem 的解决方案,它很棒......在我的系统上。我已经gulp在全球范围内安装了,但我的一位同事没有,所以预构建事件会失败。从 Task Runner Explorer 运行 gulp 使用项目级gulp 安装,但从预构建脚本运行 gulp 使用全局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用作中介。继续上面的示例并进行修改,我有一个my-task从命令行调用的 gulp 任务。这删除了全局 gulp 依赖项,如果 gulp 失败,仍然可以正确停止 msbuild。

预建事件:

npm run build

包.json:

"scripts": {
  "build": "gulp min"
}
于 2016-03-17T15:17:25.947 回答
2

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

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

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

  "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'))
});

后两行是最重要的。jshint-stylish如果您还没有npm install,您将需要它。

或者,对于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 错误列表窗口

与通过命令行或Task Runner运行相同任务时获得的更详细的错误信息相反... 通过 cmd.exe gulp 默认任务输出

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

干杯。

于 2016-03-25T02:06:20.030 回答