2016-07-13 32 views
7

Używam projektu kompilacji TFS do zbudowania projektu Visual Studio 2015, który zawiera między innymi plik gulp do kompilowania SASS. Próbuję zrozumieć sekwencję zdarzeń za pomocą MSBuild Tasks i powiązania Task Runner. Wydaje się, że MSBuild wie tyle, aby wykryć i uruchomić domyślną BeforeBuild zadanie łyk:Kolejność zdarzeń - Wiązania MSBuild i Task Runner (Gulp)

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

mam stosując cel MSBuild uruchomić po tarczy BeforeBuild tak, że mogę to wygenerowane pliki w projekcie do publikacji:

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

Tu jest moje wezwanie MSBuild w moim kompilacji .proj plik z odpowiedniej informacji:

<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"/> 

te dwie rzeczy wydają się działać w odpowiedniej kolejności everyti ja je prowadzę. Nasuwa się jednak kilka pytań:

  • Czy "BeforeBuild" wiążący dla Task Runner zostanie wykonany przed celem "BeforeBuild" w MSBuild?
  • Czy porządek wiązań/celów jest tutaj deterministyczny?
  • Czy przy korzystaniu z właściwości AfterTargets należy się upewnić, że zostanie ona uruchomiona po zakończeniu etapu "BeforeBuild" (cele i powiązania)?
  • W jaki sposób MSBuild wie, jak używać mojego pliku Gulp? Zakładam, że musi to być ten sam mechanizm, jakiego używa studio visual.

Odpowiedz

1

Wpadłem na problem, w którym wszystko działało lokalnie podczas budowania z Task Runner, ale Gulp nigdy nie został wywołany przez MSBuild.

Skończyło się na następującym rozwiązaniu, które rozszerza zadanie Compile o nasz niestandardowy cel GulpBuild. W tym fragmencie build jest nazwą mojego zadania 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.