事件顺序 - MSBuild和任务运行器绑定(Gulp)

时间:2016-07-13 17:57:15

标签: msbuild gulp task-runner-explorer

我正在使用TFS构建项目来构建一个Visual Studio 2015项目,该项目包含用于编译SASS的gulp文件。我试图了解使用MSBuild任务和任务运行器绑定的事件序列。似乎MSBuild知道足以检测并运行我的默认gulp任务BeforeBuild:

/// <binding BeforeBuild='default' />
var gulp = require('gulp');
var sass = require('gulp-sass');
var importer = require('sass-importer-npm');

gulp.task('sass', function () {
  return gulp.src([
    './sass/**/*.scss',
    './node_modules/font-awesome/scss/**/*.scss'
  ])
    .pipe(sass({ importer: importer }).on('error', sass.logError))
    .pipe(gulp.dest('./Content/css'));
});

我将使用MSBuild目标在BeforeBuild目标之后运行,以便我可以将生成的文件包含在项目中以供发布:

<Target Name="CopyGulpFiles" AfterTargets="BeforeBuild">

这是我的构建.proj文件中的MSBuild调用,其中包含相关信息:

<ItemGroup>
    <ProjectsToBuild Include="$(MSBuildThisFileDirectory)..\MyProject.sln">
      <AdditionalProperties>
        VisualStudioVersion=$(VisualStudioVersion);
        OutputPath=$(OutputRoot);
        WebPublishMethod=FileSystem;
        publishUrl=$(StageFolder); 
        DeployOnBuild=false;
        DeployTarget=WebPublish;
        PublishProfile=$(MSBuildThisFileFullPath)
      </AdditionalProperties>
    </ProjectsToBuild>
  </ItemGroup>

<MSBuild Projects="@(ProjectsToBuild)" Properties="Configuration=Dev"/>

每次运行它们时,这两件事似乎都以正确的顺序运行。这提出了一些问题:

  • &#39; BeforeBuild&#39;任务运行器的绑定在&#39; BeforeBuild&#39;之前执行。 MSBuild中的目标?
  • 这里的绑定/目标的顺序是否确定?
  • 使用AfterTargets属性是否确保在整个&#39; BeforeBuild&#39;之后运行。阶段(目标和绑定)完成了吗?
  • MSBuild如何知道如何使用我的Gulp文件?我认为它必须与visual studio使用的机制相同。

1 个答案:

答案 0 :(得分:3)

我遇到了在使用Task Runner构建时本地一切正常的问题,但是Gulp从未被MSBuild调用过。

我最终得到了以下解决方案,该解决方案使用我们的自定义目标Compile扩展了GulpBuild任务。在此代码段build中是我的Gulp任务的名称。

<PropertyGroup>
    <CompileDependsOn>
        $(CompileDependsOn);
        GulpBuild;
    </CompileDependsOn>
</PropertyGroup>
<Target Name="GulpBuild">
    <Exec Command="npm install" />
    <Exec Command="gulp build" />
</Target>

Steve Cadwallader's post was very helpful in solving this issue.