0

我在使用 msbuild 文件时遇到了一些问题。

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

  • Cleanup:清理先前构建的输出
  • Build: 实际构建
  • CopyFiles:打包构建输出以便于部署的任务

现在的问题是:我希望调用者显式设置目标的属性 ( ReleasePath) 。此外,如果只调用and任务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是包含在目标中?

我还想过放入项目InitializeInitialTargets属性,然后设置一个条件,仅当CopyFiles被选中时才执行此目标,但令我惊讶的是,我找不到包含调用者选择的目标列表的属性。

4

1 回答 1

0

我认为实现目标的最简单方法是使用属性来切换 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 

这将打开它。

于 2013-02-06T04:43:15.873 回答