42

我们有将构建版本控制为 [major].[minor].[micro].[revision] 的惯例,例如 2.1.2.33546。

我们的构建脚本会自动更新 AssemblyInfo.cs 文件,其中包含

[assembly: AssemblyVersion("x.y.z.w")]

为了在程序集中嵌入版本号。

但是我们的 Subversion 存储库刚刚达到修订版 #65535,这破坏了我们的构建。

事实证明,版本号中的每个数字的最大值为 65534(可能是由于 Windows 限制)。

你遇到过这个问题吗?有什么好的解决方案/解决方法吗?

我们喜欢嵌入修订号的方案,我们显然不能只重置我们的 Subversion-server :-)

4

5 回答 5

45

更多背景信息:

为什么内部版本号限制为 65535?

由于这不太可能改变,您的选择是:

  • 取 Revision Modulo 65535,这意味着你回到了 1
  • 使用版本号中的 Micro-Field 通过将修订除以 1000 来拆分版本号。这意味着您的版本可能是 1.0.65.535
  • 不要将 SVN 修订版存储在 AssemblyVersion 中,而是存储在AssemblyInformationalVersion中。这样,您的应用程序仍然可以访问它以进行显示,尽管您不能再使用 Windows 资源管理器来快速检查 SVN 修订版
  • 不要将 SVN 修订版存储在 AssemblyVersion 中,而是存储在 AssemblyProduct 或 AssemblyDescription 字段中。同样,这样您的应用程序仍然可以访问它,而且资源管理器现在也会在属性表中显示它。
于 2009-07-27T14:12:12.117 回答
11

一种选择可能是只使用[AssemblyFileVersion]; 这仍然会引发警告,但至少会构建:

[assembly: AssemblyFileVersion("1.0.0.80000")]
于 2009-07-27T13:59:11.757 回答
9

我们决定使用相同的约定,并且由于 Windows 版本号的限制,我们选择删除版本号的“微”部分以保留修订号。我们的版本号现在是[major].[minor].[revision / 10000].[revision % 10000],因此从修订版 65535 构建的程序集的版本为 2.01.6.5535。

于 2009-07-27T14:10:01.120 回答
5

根据 MSDN,AssemblyVersionAttribute 版本号UInt16.MaxValue - 1 的组件受程序集元数据的限制,即您不能在程序集文件中存储更大的数字。正如 Marc Gravell 所建议的,文件版本可能对您来说就足够了,这取决于谁会阅读您的版本号。

于 2009-07-27T14:03:14.263 回答
1

此答案适用于使用Azure Build Pipeline的人,他们希望将BuildId值插入为程序集版本的最后一个数字,并且BuildId. (> 65535)

我的解决方案是使用注入文件的最后 4 或 5 位数字。 我不使用模运算,因为版本号看起来与 BuildId 完全不同(达到限制后)。相反,在我的解决方案中,“短路”版本看起来类似于 BuildId。BuildIdAssemblyInfo.cs

例子:

AssemblyVersionis 1.0.0.0and the is BuildId333.
--> 新的 AssemblyVersion 变为1.0.0.333. (数量少,没问题。

AssemblyVersionis1.0.0.0和 the是BuildId55555。
--> 新的 AssemblyVersion 变为1.0.0.55555. (还在范围内。

AssemblyVersionis1.0.0.0和 the is BuildId66666.
--> 新的 AssemblyVersion 变为1.0.0.6666. (使用最后 4 位数字。不可能更多。

AssemblyVersionis1.0.0.0和 the是BuildId111111。
--> 新的 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 并将其保存到 variable shortBuildId

第二个任务更新文件中的第 4 个版本字段AssemblyInfo.cs。因此,短 buildId 被注入到AssemblyVersionAssemblyFileVersion.

注意:在此文件中,您需要一个带有 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,它可以免费使用。

于 2022-01-05T17:55:54.970 回答