[英].NET: Large revision numbers in AssemblyVersionAttribute
我们有将构建版本控制为 [major].[minor].[micro].[revision] 的惯例,例如 2.1.2.33546。
我们的构建脚本会自动更新 AssemblyInfo.cs 文件,其中包含
[assembly: AssemblyVersion("x.y.z.w")]
为了在程序集中嵌入版本号。
但是我们的 Subversion 存储库刚刚达到修订版 #65535,这破坏了我们的构建。
事实证明,版本号中的每个数字的最大值为 65534(可能是由于 Windows 限制)。
你遇到过这个问题吗? 有什么好的解决方案/解决方法吗?
我们喜欢嵌入修订号的方案,我们显然不能只重置我们的 Subversion-server :-)
更多背景信息:
由于这不太可能改变,您的选择是:
一种选择可能是只使用[AssemblyFileVersion]
; 这仍然会引发警告,但至少会构建:
[assembly: AssemblyFileVersion("1.0.0.80000")]
我们决定使用相同的约定,并且由于 Windows 版本号的限制,我们选择删除版本号的“微”部分以保留修订号。 我们的版本号现在是[major].[minor].[revision / 10000].[revision % 10000]
,因此从版本 65535 构建的程序集的版本为 2.01.6.5535。
根据 MSDN ,AssemblyVersionAttribute 版本号的组件由程序集元数据限制为UInt16.MaxValue - 1
,即您不能在程序集文件中存储更大的数字。 正如 Marc Gravell 所建议的,文件版本可能对您来说就足够了,这取决于谁会阅读您的版本号。
此答案适用于使用Azure Build Pipeline的人,他们希望将BuildId值插入为程序集版本的最后一个数字,并且遇到BuildId
值过大的问题。 (> 65535)
我的解决方案是使用BuildId
的最后 4 或 5 位,它们被注入到文件AssemblyInfo.cs
中。
我不使用模运算,因为版本号看起来与 BuildId 完全不同(达到限制后)。 相反,在我的解决方案中,“短路”版本看起来类似于 BuildId。
例子:
AssemblyVersion
为1.0.0.0
, BuildId
为 333。
--> 新的 AssemblyVersion 变为1.0.0.333
。 (数量少,没问题。 )
AssemblyVersion
为1.0.0.0
, BuildId
为 55555。
--> 新的 AssemblyVersion 变为1.0.0.55555
。 (还在范围内。 )
AssemblyVersion
为1.0.0.0
, BuildId
为 66666。
--> 新的 AssemblyVersion 变为1.0.0.6666
。 (使用最后 4 位数字。不可能更多。 )
AssemblyVersion
为1.0.0.0
, BuildId
为 111111。
--> 新的 AssemblyVersion 变为1.0.0.11111
。 (使用最后 5 位数字。 )
按照以下步骤轻松使用
第 1 步:通过此代码段在您的管道中定义变量shortBuildId
。
variables:
- name: shortBuildId # note: The last 4 or 5 digits of the BuildId, because for the assembly version number the maximum value is 65535
value: '[not set]' # will be set by powershell script
或者,您可以像这样定义它。 这取决于您如何定义已经存在的变量的样式。
variables:
shortBuildId: '[not set]'
第 2 步:将这些任务插入现有任务之上。
第一个任务创建短 BuildId 并将其保存到变量shortBuildId
。
第二个任务更新文件AssemblyInfo.cs
中的第 4 个版本字段。 因此,短 buildId 被注入到AssemblyVersion
和AssemblyFileVersion
中。
注意:在此文件中,您需要一个带有 4 个数字的程序集版本(例如1.0.0.0
)。 如果您只有 3 个数字(例如1.0.0
),它将不起作用。
- task: PowerShell@2
displayName: Define short build ID
# If allowed, use the last 5 digits. If they are larger than 65000, use the last 4 digits. Leading zeros are removed.
# This is needed, because the full build ID can't be used as number for the assembly version.
inputs:
targetType: 'inline'
script: |
$shortId = $env:BUILD_BUILDID
$shortId = $shortId % 100000
if ($shortId -gt 65000) { $shortId = $shortId % 10000 }
Write-Host "Build ID: $env:BUILD_BUILDID --> $shortId"
Write-Host "##vso[task.setvariable variable=shortBuildId]$shortId"
showWarnings: true
- task: RegexReplace@3
displayName: Insert shortBuildId into AssemblyInfo:
InputSearchPattern: 'myProjectDirectory\Properties\AssemblyInfo.cs'
FindRegex: '(\[assembly: (AssemblyVersion|AssemblyFileVersion)\("\d+\.\d+\.[0-9*]+)\.[0-9*]+("\)\])'
ReplaceRegex: '$1.$(shortBuildId)$3'
UseUTF8: true
UseRAW: true
第 3 步:调整与您的项目相关的第二个任务中的路径。
编辑InputSearchPattern
的值。
如果要将 shortBuildId 插入到解决方案的所有项目中,只需编写InputSearchPattern: '**\AssemblyInfo.cs'
信用
感谢 Edmund Weitz 博士的伟大工具The Regex Coach ,它可以免费使用。
我想为任何使用 semver/gitflow 的人提出以下方案:
其中“Gitflow ID”是一个数字,后跟0000
- 9999
,根据以下内容:
Gitflow ID | 分支 |
---|---|
00000 - 09999 |
发布(阿尔法) |
10000 - 19999 |
发布(测试版) |
20000 - 29999 |
发布 (RC) |
30000 - 65535 |
发展 |
00000
- 29999
背后的直觉是这些数字代表某种逻辑负预发布数字, 30000
代表逻辑零, 30001
- 65535
代表逻辑正数。 更正式地说,这是一种10 的补码表示,偏移量K = 30000
。
例如:
0.0.0.30000
开始0.0.0.30000
开始0.0.0.31000
处合并到开发,而功能/A 在0.0.0.30021
0.0.0.31001
合并来自 dev 的更新0.0.0.32000
处合并到 dev1.0.0.00001
开始1.0.0.20002
1.0.0.30000
发布给 Master1.0.1.30000
应用1.0.1.30002
以上表明开发范围30000-65535
可以进一步细分为主题分支,即DDTTT
, DD
范围从30
到65
(最多 65 - 30 + 1 = 36 个开发 PR 直到发布)。 或者,整个范围可以不加区别地用于开发和主题分支; 在这种情况下,从 dev 合并到 topic 的 topic 是 dev + 1,反之亦然。 任何一种情况都允许在主题分支级别有多个相同的版本号,但对于任何开发提交只有一个版本号。 DDTTT
安排使哪个版本号代表开发提交(例如57000
)更加清晰,但以限制发布中的开发提交数量为代价。 但是,假设发布节奏足够频繁,这应该不是问题。 无论如何,生产版本清楚地被视为具有 gitflow ID 30000
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.