gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:53:35 27 4
gpt4 key购买 nike

我有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com