msbuild - 如何始终在 MSBuild 中执行目标

标签 msbuild

我有一个 MSBuild 文件,它在编译应用程序之前操作 AssemblyInfo 文件。在构建结束时,它会恢复 AssemblyInfo 文件。它通过备份文件、操作文件,然后在构建时间后恢复文件来实现此目的。

除非在构建过程中发生错误,否则这工作得相当好。然后它不会恢复原始文件。有没有办法让 MSBuild 在构建结束时执行目标,无论成功还是失败?

最佳答案

根据您对原始问题的最后评论,我会采取另一种方法,并忘记您当前采用的方法。您应该知道您的版本信息不必位于 AssemblyInfo.cs 文件中。它可以位于任何代码文件中,只要您仅分别定义一次 AssemblyVersion 和 AssemblyFileVersion 属性即可。话虽如此,我要做的是按照以下步骤操作:

  1. 从 AssemblyInfo.cs 中删除 AssemblyVersion 和 AssemblyFileVersion
  2. 创建一个新文件,将其命名为您想要的任何名称,在我的例子中,我将其放在 Properties\VersionInfo.cs 中。 不要将此文件添加到项目中。
  3. 编辑项目文件,以便仅在需要时将该文件包含到要编译的文件列表中

让我们对#3 进行一些扩展。当您生成 .NET 项目时,该项目本身就是一个 MSBuild 文件。在该文件中,您将找到一个声明为 Compile 的项目。这是将发送到编译器进行编译的文件列表。您可以动态地包含/排除该列表中的文件。在您的情况下,仅当您在构建服务器上构建(或您定义的任何其他条件)时,您才需要包含 VersionInfo.cs 文件。对于此示例,我将该条件定义为项目是否在 Release模式下构建。因此,对于 Release模式,VersionInfo.cs 将被发送到编译器,而对于其他版本则不会。以下是VersionInfo.cs的内容

VersionInfo.cs

[assembly: System.Reflection.AssemblyVersion("1.2.3.4")]
[assembly: System.Reflection.AssemblyFileVersion("1.2.3.4")]

为了将其挂接到构建过程中,您必须编辑项目文件。在该文件中,您将找到一个元素(可能超过 1 个,具体取决于项目类型)。您应该在此处添加类似于以下内容的目标。

<Target Name="BeforeCompile">
  <ItemGroup Condition=" '$(Configuration)'=='Release' ">
    <Compile Include="Properties\VersionInfo.cs" />
  </ItemGroup>
</Target>

我在这里所做的是定义一个目标BeforeCompile,这是一个众所周知的目标,您可以覆盖它。看这个MSDN article关于其他类似的目标。基本上,这是一个始终在调用编译器之前调用的目标。在此目标中,仅当 Configuration 属性设置为 release 时,我才将 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 即可。注意:这在构建解决方案时不起作用。

关于msbuild - 如何始终在 MSBuild 中执行目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701177/

相关文章:

.net - 加快 ASP.NET 中的构建时间

msbuild - 如何忽略SetParameter.xml中的连接字符串参数

msbuild - 如何让 TeamCity 利用 MSBuild 的增量构建支持?

msbuild - 使用 msbuild 3.5 构建解决方案时跳过项目

.net - 解决 MSB3247 - 发现同一依赖程序集的不同版本之间存在冲突

c# - vstest.console.exe 可以在没有安全证书的情况下运行 appx

c# - 如何在 dotnet pack nuget 包中包含来自构建输出 (dacpac) 的非 dll 文件?

git - 如何编辑/更新构建任务 TFS 中的默认获取源步骤?

batch-file - 批处理文件 - 错误代码

asp.net-mvc - TFS 构建 2012、ASP.NET MVC 和 MSB3247 : Found conflicts between different versions of same dependent assembly