我在使用msbuild文件时遇到了一些麻烦。
我希望构建有三个目标,按此顺序执行:
Cleanup
:清除上一版本的输出Build
:实际构建CopyFiles
:打包构建输出以便于部署的任务现在的问题是:我希望调用者明确设置ReleasePath
目标的属性(CopyFiles
)。此外,如果仅调用Cleanup
和Build
任务,则调用者不必设置输出路径。
我的第一次尝试是:
<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
时才设置执行此目标的条件,但令我惊讶的是我无法'找到包含调用者选择的目标列表的属性。
答案 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
这会打开它。