42

ビルドを [major].[minor].[micro].[revision] としてバージョン管理する規則があります (例: 2.1.2.33546)。

私たちのビルド スクリプトは、AssemblyInfo.cs ファイルを自動的に更新します。

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

アセンブリにバージョン番号を埋め込むため。

しかし、私たちの Subversion リポジトリはリビジョン #65535 に達したばかりで、ビルドが壊れてしまいました。

version-number の各数値の最大値は 65534 であることが判明しました (おそらく Windows の制限によるものです)。

この問題に遭遇しましたか? 良い解決策/回避策はありますか?

リビジョン番号を埋め込むスキームが気に入っていますが、明らかに Subversion-server をリセットすることはできません :-)

4

5 に答える 5

45

もう少し背景情報:

ビルド番号が 65535 に制限されているのはなぜですか?

これが変更される可能性は低いため、選択肢は次のとおりです。

  • リビジョン Modulo 65535 を取得します。これは、1 に戻ったことを意味します。
  • バージョン番号に Micro-Field を使用して、リビジョンを 1000 で割ってバージョン番号を分割します。つまり、バージョンは 1.0.65.535 になる可能性があります。
  • SVN リビジョンを AssemblyVersion に保存しないでください。代わりに AssemblyInformationalVersion に保存してください。そうすれば、アプリケーションは表示目的で引き続きアクセスできますが、Windows Explorer を使用して SVN リビジョンをすばやく確認することはできなくなります。
  • AssemblyVersion ではなく、AssemblyProduct または AssemblyDescription フィールドに SVN リビジョンを格納します。繰り返しますが、アプリケーションは引き続きアクセスできますが、エクスプローラーでもプロパティ シートに表示されます。
于 2009-07-27T14:12:12.117 に答える
11

1 つのオプションは、単に使用すること[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

例:

はで、は 333AssemblyVersionです。 --> 新しい AssemblyVersion は になります。(少数でも問題ありません。 )1.0.0.0BuildId
1.0.0.333

AssemblyVersion1.0.0.0BuildIdは 55555 です。
--> 新しい AssemblyVersion は になり1.0.0.55555ます。(まだ範囲内です。 )

AssemblyVersion1.0.0.0BuildIdは 66666 です。
--> 新しい AssemblyVersion は になり1.0.0.6666ます。(下 4 桁を使用します。それ以上は使用できません。 )

AssemblyVersion1.0.0.0BuildIdは 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 を作成し、 variable に保存しますshortBuildId

2 番目のタスクは、ファイルの 4 番目のバージョン フィールドを更新しますAssemblyInfo.csAssemblyVersionしたがって、短い buildId がと の両方に注入され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 : プロジェクトに関連する 2 番目のタスクのパスを調整します。

の値を編集しますInputSearchPatternソリューションのすべてのプロジェクトに
shortBuildId を挿入する場合は、次のように記述します。InputSearchPattern: '**\AssemblyInfo.cs'

クレジット

Edmund Weitz 博士の素晴らしいツールであるThe Regex Coachに感謝します。このツールは無料で使用できます。

于 2022-01-05T17:55:54.970 に答える