gpt4 book ai didi

c# - 如何仅在程序集更改时使用 MSBuild 更新版本信息?

转载 作者:太空狗 更新时间:2023-10-29 18:28:32 25 4
gpt4 key购买 nike

我需要将多个 Web 安装项目(使用 VS2005 和 ASP.Net/C#)安装到同一个虚拟文件夹中。这些项目共享一些程序集引用(文件系统都被结构化为使用相同的“bin”文件夹),这使得对这些程序集的更改部署存在问题,因为 MS 安装程序只会在当前安装的版本早于版本时才覆盖程序集。 MSI。

我并不是说悲观的安装方案是错误的——只是它在我工作的环境中造成了问题。由于有大量的通用程序集和大量开发人员可能会更改通用程序集但忘记更新其版本号,因此尝试手动管理版本控制最终将导致安装时出现大量困惑。

在这个问题的另一面,同样重要的是不要自发更新版本号并将所有通用程序集替换为每个安装,因为这可能(至少暂时) 掩盖了实际发生变化的情况。

也就是说,我正在寻找一种仅在程序集组成部分(代码模块、资源等)已经/已经实际更改的情况下更新程序集版本信息(最好使用 MSBuild)的方法。

我找到了一些至少部分相关的引用资料 here (MSDN 上的 AssemblyInfo 任务)和 here (看起来与我需要的相似,但已有两年多历史且没有明确的解决方案)。

我的团队也使用 TFS 版本控制,因此自动化解决方案可能应该包括一种在构建期间可以 check out /检入 AssebmlyInfo 的方法。

如有任何帮助,我们将不胜感激。

提前致谢。

最佳答案

我无法回答您所有的问题,因为我没有使用 TFS 的经验。

但我可以推荐一种比使用 AssemblyInfo 任务更好的方法来更新您的 AssemblyInfo.cs 文件。该任务似乎只是从头开始重新创建一个标准的 AssemblyInfo 文件,并且会丢失您可能已添加的任何自定义部分。

因此,我建议您查看 MSBuild 社区任务项目中的 FileUpdate 任务。它可以在文件中查找特定内容并替换它,如下所示:

<FileUpdate 
Files="$(WebDir)\Properties\AssemblyInfo.cs"
Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="$(Major).$(ServicePack).$(Build).$(Revision)"
Condition="'$(Configuration)' == 'Release'"
/>

有几种方法可以控制内部版本号的递增。因为我只希望在构建完全成功时构建编号递增,所以我使用两步法:

  • 从文本文件中读取一个数字(文件中只有数字)并在不更改文件的情况下加1;
  • 作为构建过程的最后一步,如果一切成功,将增加的数字保存回文本文件。

有诸如 ReadLinesFromFile 之类的任务可以帮助您解决这个问题,但我发现编写一个小的自定义任务最简单:

using System;
using System.IO;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace CredibleCustomBuildTasks
{
public class IncrementTask : Task
{
[Required]
public bool SaveChange { get; set; }

[Required]
public string IncrementFileName { get; set; }

[Output]
public int Increment { get; set; }

public override bool Execute()
{
if (File.Exists(IncrementFileName))
{
string lines = File.ReadAllText(IncrementFileName);
int result;
if(Int32.TryParse(lines, out result))
{
Increment = result + 1;
}
else
{
Log.LogError("Unable to parse integer in '{0}' (contents of {1})");
return false;
}
}
else
{
Increment = 1;
}

if (SaveChange)
{
File.Delete(IncrementFileName);
File.WriteAllText(IncrementFileName, Increment.ToString());
}
return true;
}
}
}

我在 FileUpdateTask 之前使用它来获取下一个内部版本号:

<IncrementTask 
IncrementFileName="$(BuildNumberFile)"
SaveChange="false">
<Output TaskParameter="Increment" PropertyName="Build" />
</IncrementTask>

作为我在构建中的最后一步(在通知其他人之前):

<IncrementTask 
IncrementFileName="$(BuildNumberFile)"
SaveChange="true"
Condition="'$(Configuration)' == 'Release'" />

您的另一个问题是如何仅在源代码更改时更新版本号,这在很大程度上取决于您的构建过程如何与源代码管理交互。通常, checkin 源文件更改应该启动持续集成构建。那就是用来更新相关版本号的那个。

关于c# - 如何仅在程序集更改时使用 MSBuild 更新版本信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/223253/

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