我有一个MSBuild文件,在应用编译之前操作AssemblyInfo文件。在构建结束时,它会还原AssemblyInfo文件。它通过备份文件、操作文件,然后在构建完成后恢复文件来实现这一点。
这个方法运作得相当不错,但是当构建过程中发生错误时,它就无法还原原始文件了。我能否告诉MSBuild在构建结束时执行一个目标,无论是否成功?
这个方法运作得相当不错,但是当构建过程中发生错误时,它就无法还原原始文件了。我能否告诉MSBuild在构建结束时执行一个目标,无论是否成功?
[assembly: System.Reflection.AssemblyVersion("1.2.3.4")]
[assembly: System.Reflection.AssemblyFileVersion("1.2.3.4")]
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(Configuration)'=='Release' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
我在这里所做的是定义了一个目标,BeforeCompile,这是一个可以覆盖的众所周知的目标。关于其他类似的目标,请参阅MSDN文章。基本上,这是一个总是在编译器被调用之前调用的目标。在这个目标中,如果Configuration属性设置为发布,则我仅将VersionInfo.cs添加到Compile项目中。您可以将该属性定义为任何您想要的内容。例如,如果您的构建服务器是TFS,则可能会是以下内容:
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(TeamFoundationServerUrl)'!='' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
因为我们知道TeamFoundationServerUrl仅在通过TFS进行构建时才定义。
如果您是使用命令行构建,则可以像这样:
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(IncludeVersionInfo)'=='true' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
当你构建项目时,只需执行 msbuild.exe YourProject.proj /p:IncludeVersion=true。注意:在构建解决方案时,此方法无效。
进一步完善地,将Sayed的解决方案与我的结合起来,从实际的AssemblyInfo.cs中删除版本信息内容,并在BeforeBuild中添加一个被检入的VersionInfo.cs.template,用于创建VersionInfo.cs。
我从未使用过它,但根据文档,OnError Element 似乎对你试图实现的内容有用。
如果一个任务失败且 ContinueOnError 属性为 false,则会导致一个或多个目标执行。