我正在使用 Visual Studio 任务运行器 (2015) 运行绑定到构建之前的 Gulp 任务。
我已对其进行了设置,以便当 gulp 任务失败时,它会发送退出代码 1,并在最后显示“进程以代码 1 终止”。但是构建仍在继续。
这将取消团队城市中的构建,因此似乎与 Visual Studio 中的 Task Runner 相关联。
如果构建以 0 以外的代码退出,如何防止构建发生?
我正在使用 Visual Studio 任务运行器 (2015) 运行绑定到构建之前的 Gulp 任务。
我已对其进行了设置,以便当 gulp 任务失败时,它会发送退出代码 1,并在最后显示“进程以代码 1 终止”。但是构建仍在继续。
这将取消团队城市中的构建,因此似乎与 Visual Studio 中的 Task Runner 相关联。
如果构建以 0 以外的代码退出,如何防止构建发生?
你是对的,这似乎是一个 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)
是构建命令的宏之一。npm install -g gulp
. 请参阅jonas.ninja的答案,了解如何将此安装构建到命令中(或不需要全局依赖的替代方案)。我在上面实现了 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"
}
我在 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"
}
}
当出现错误(除了失败的构建)时,这给了我这个,这足以让我在必要时进一步挖掘......
与通过命令行或Task Runner运行相同任务时获得的更详细的错误信息相反...
我想这个解决方案可以改进,但我想我会分享,因为我在其他地方没有看到很多关于它的信息。
干杯。