13

我们有一个夜间构建过程,可以自动对所有 C++ 项目进行版本控制。这是它的工作原理。有一个通用的头文件VersionNumber.h,它具有特定#define的版本号。几乎构建检查这个文件,增加它后面的整数#define并将其签入。所有 Visual C++ 项目#include都标头到它们的资源文件中,并使用该定义来指定版本(版本是 smth like 1.0.3.ThatNumber)。

到现在为止还挺好。现在,我希望在同一日常构建中构建的 C# 类库也具有相同的功能。目前他们都有

[assembly: AssemblyVersion("1.0.*")]

在 AssemblyInfo.cs 文件和库1.0.HorribleNumber.AnotherHorribleNumber中以版本结尾,这两个数字与 C++ 项目使用的数字无关。

如何以最少的努力在我的 C# 项目中获得相同的确定性自动版本编号?

4

4 回答 4

12

首先,您可以指定完整版本,如下所示:

[assembly: AssemblyVersion("1.0.9.10")]

其次,一种使这更简单的常用方法(并且与您的 C++ 方法相呼应)是在一个包含版本属性的公共位置有一个单独的 Version.cs 文件(名称不重要)。然后,您可以将此文件添加为所有 cs 项目的链接,记住从您的 AssemblyInfo.cs 文件中删除版本属性。这样,您只需更新一个文件(在运行构建之前)。您还可以将其他常见的程序集属性放在您的 Version.cs 文件中,例如:NeutralResourcesLanguage 或 CLSCompliant。

如果您不使用单一的“Version.cs”方法,那么您可以通过源代码目录结构递归地工作,并单独更新 AssemblyInfo 文件(在运行构建之前)。

它可能与您无关,但版本号(在 AssemblyVersion 中)的最大范围为 16 位。我已经看到这成为这些数字使用日期的问题。如果您希望有更多的自由度,则 AssemblyFileVersion 没有这些限制,但仅用于 .Net 中的信息目的,而不是程序集身份的一部分。通常将 AssemblyVersion 和 AssemblyFileVersion 设置为相同的值,因为某些工具会显示这些值的组合。

有关 AssemblyVersion 与 AssemblyFileVersion 的更多信息,请参见以下内容:

AssemblyVersion、AssemblyFileVersion 和 AssemblyInformationalVersion 之间有什么区别?

于 2010-07-27T08:16:21.453 回答
2

我们使用 FinalBuilder 进行自动构建(我们有 TeamCity 调用它),它会自动执行此类操作(即它可以从其他地方(ini 文件、环境变量、命令行等)获取构建号,然后更新所有带有内部版本号的程序集版本。)

显然不是唯一的方法,但如果你没有使用过 FinalBuilder 之类的东西,那就试一试 - 我们的经验是你开始想知道为什么你之前花了这么长时间聪明地使用 Makefiles 和批处理文件......

但是,如果您不想这样做,您能否获得相同的过程来生成/修改 VersionNumber.h 文件以吐出 VersionNumber.cs,其中包含 AssemblyVersion 行?然后,您可以将该文件包含在您的项目中。

AssemblyVersion 指令不需要与所有其他 AssemblyInfo 内容位于同一文件中。

于 2010-07-27T08:11:56.807 回答
1

您可以执行您已经为您的 C++ 技术执行的操作,但搜索"assembly: AssemblyVersion(字符串并将引号中的数字替换为所需的完整版本号。

在 C# 中,版本号上的通配符告诉编译器自动更新版本号——如果没有通配符,它​​将只使用提供的完整号。

例如

[assembly: AssemblyVersion("1.0.3.10")]

将始终使用该版本号,直到您在文件中更改它。

于 2010-07-27T08:11:44.433 回答
1

您可以通过添加链接从另一个文件设置程序集版本。类似的解决方案是

链接文本

于 2010-07-27T08:14:13.107 回答