我们有一个每晚构建过程,自动版本化所有C ++项目。这是它的工作原理。有一个公共头文件VersionNumber.h
,其版本号具有特定#define
。 nighly构建检查此文件,增加#define
后面的整数并将其检入。所有Visual C ++项目#include
标题到其资源文件中并使用该定义来指定版本(版本是smth比如1.0.3.ThatNumber
)。
到目前为止一切顺利。现在,我想对在同一日常构建中构建的C#类库具有相同的功能。目前他们都有
[assembly: AssemblyVersion("1.0.*")]
AssemblyInfo.cs文件和库中的最终以1.0.HorribleNumber.AnotherHorribleNumber
作为版本,这两个数字与C ++项目使用的数字无关。
如何以最小的努力在我的C#项目中使用相同的清除自动版本编号?
答案 0 :(得分:12)
首先,您可以按如下方式指定完整版本:
[assembly: AssemblyVersion("1.0.9.10")]
其次,使这更简单(并回应您的C ++方法)的一种常见方法是使一个Version.cs文件(名称不重要)位于具有其中版本属性的公共位置。然后,您可以 add this file as a link 到所有cs项目,记住要从AssemblyInfo.cs文件中删除版本属性。这样,您只需要更新一个文件(在运行构建之前)。您还可以在Version.cs文件中放置其他常用程序集属性,例如:NeutralResourcesLanguage或CLSCompliant。
如果您不使用单个“Version.cs”方法,那么您可以递归地处理源代码目录结构,并单独更新AssemblyInfo文件(在运行构建之前)。
它可能与您无关,但版本号(在AssemblyVersion中)的最大范围为16位。我已经看到这成为这些数字使用日期的问题。如果你希望拥有更大的自由度,那么AssemblyFileVersion没有这些限制,但纯粹仅用于.Net中的信息目的,而不是程序集的标识的一部分。将AssemblyVersion和AssemblyFileVersion设置为相同的值是常见的,因为某些工具会显示这些值的组合。
有关AssemblyVersion与AssemblyFileVersion的更多信息,请参阅以下内容:
What are differences between AssemblyVersion, AssemblyFileVersion and AssemblyInformationalVersion?
答案 1 :(得分:2)
我们使用FinalBuilder进行自动构建(我们让TeamCity调用它),它会自动完成这类工作(即它可以从其他地方获取构建号(ini文件,环境变量,命令行,等等)然后使用内部版本号为您更新所有程序集版本。)
显然不是唯一的方法,但是如果你没有使用像FinalBuilder这样的东西,那么试一试 - 我们的经验是你开始想知道为什么你以前花了这么长时间聪明的Makefile和批处理文件。 ..
但是如果您不想这样做,您是否可以获得生成/修改VersionNumber.h文件的同一进程,以便吐出VersionNumber.cs,其中包含AssemblyVersion行?然后,您可以在项目中包含该文件。
AssemblyVersion指令不需要与AssemblyInfo的所有其他东西在同一个文件中。
答案 2 :(得分:1)
您可以执行类似于C ++技术的操作,但搜索"assembly: AssemblyVersion(
字符串并将引号中的数字替换为完整的所需版本号。
在C#中,版本号上的通配符告诉编译器自动更新版本号 - 如果没有通配符,它将只使用提供的完整号码。
e.g。
[assembly: AssemblyVersion("1.0.3.10")]
在您在文件中更改之前,将始终使用该版本号。
答案 3 :(得分:0)
您可以通过添加链接来从另一个文件设置程序集版本。类似的解决方案是