根据所选目标,在启动时检查属性

时间:2013-02-05 13:17:40

标签: msbuild

我在使用msbuild文件时遇到了一些麻烦。

我希望构建有三个目标,按此顺序执行:

  • Cleanup:清除上一版本的输出
  • Build:实际构建
  • CopyFiles:打包构建输出以便于部署的任务

现在的问题是:我希望调用者明确设置ReleasePath目标的属性(CopyFiles)。此外,如果仅调用CleanupBuild任务,则调用者不必设置输出路径。

我的第一次尝试是:

<PropertyGroup>
  <ReleasePath></ReleasePath>
</PropertyGroup>

<Target Name="Initialize">
  <Error Text="The ReleasePath property isn't defined" Condition="'$(ReleasePath)' == ''"/>
</Target>

<Target Name="CopyFiles" DependsOnTargets="Initialize">
</Target>

它工作正常,但Initialize目标在CopyFiles之前执行,即Build之后。并且Build目标可能需要很长时间才能执行,因此如果出现问题,我希望立即通知用户。

基本上,有没有办法在开始时运行Initialize目标,但只有在目标中包含CopyFiles的情况下?

我还想过将Initialize放在项目的InitialTargets属性中,然后只有在选择CopyFiles时才设置执行此目标的条件,但令我惊讶的是我无法'找到包含调用者选择的目标列表的属性。

1 个答案:

答案 0 :(得分:0)

我认为实现目标的最简单方法是使用Property来切换CopyFiles而不是传入的目标列表。如果你总是将CopyFiles添加到AfterBuild目标但是在像“ShouldCopyFiles”之类的属性上调整它你也可以条件化Build的DependsOnTargets:

 <PropertyGroup>
  <ShouldCopyFiles Condition="'$(ShouldCopyFiles)'==''">false</ShouldCopyFiles>
  <ReleasePath></ReleasePath>
 </PropertyGroup>

 <PropertyGroup>
   <BuildDependsOn>
     BeforeBuild;
     CoreBuild;
     AfterBuild;
     CopyFiles;
   </BuildDependsOn>

 </PropertyGroup>

 <PropertyGroup Condition="'$(ShouldCopyFiles)'=='true'">
    <BeforeBuildDependsOn>
     Initialize;
   </BeforeBuildDependsOn>
 </PropertyGroup>

 <Target Name="Initialize" Condition="'$(ShouldCopyFiles)'=='true'">CheckStuff
 </Target>

 <Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>

 <Target Name="CoreBuild">YourBuildStuff</Target>
 <Target Name="BeforeBuild" DependsOnTargets="$(BeforeBuildDependsOn)"/>
 <Target Name="AfterBuild" />

 <Target Name="CopyFiles" Condition="'$(ShouldCopyFiles)'=='true'">
   CopyStuff 
 </Target>

此时你可以这样调用MSBuild:

 msbuild my.proj /targets:Clean;Build /p:ShouldCopyFiles=true 

这会打开它。