1. ホーム
  2. c#

[解決済み] .NET Coreプロジェクトのバージョン番号を設定する - CSPROJ - JSONプロジェクトではない

2023-02-13 16:07:26

質問

この質問は、以下のものに非常によく似ています。 .NET Coreプロジェクトのバージョン番号の設定 と同じですが、同じではありません。執筆時点の最新安定版(1.1)とVS2017を使用して、.NET CoreはJSONベースのプロジェクトファイルからCSPROJファイルへと切り替わりました。

私がやろうとしていることは、CI 環境をセットアップして、そこで 何か を修正し、正しいバージョン番号でビルドをスタンプできるようにしたいのです。

私はこのように属性を使用する場合、古い(SharedAssemblyInfo.csのトリック)。

[assembly: AssemblyFileVersion("3.3.3.3")]
[assembly: AssemblyVersion("4.4.4.4")]

プロジェクトのどこかで

CS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'

そして

CS0579 - Duplicate 'System.Reflection.AssemblyVersionAttribute'

ビルド時にエラーが発生します。

少し掘り下げてみると、ビルド中に生成される(ビルドする前には存在しない)以下のようなファイルが \obj\Debug\netcoreapp1.1 :

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Reflection;

[assembly: System.Reflection.AssemblyCompanyAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.99.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.99")]
[assembly: System.Reflection.AssemblyProductAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyTitleAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.1.99.0")]

// Generated by the MSBuild WriteCodeFragment class.

質問 - このビットはどうすればいいのでしょうか?

だから私はこれが何らかの形でプロジェクトのプロパティ 'パッケージページ'に入力された値から生成されなければならないことを見ることができますが、私は私のCIマシンでこれらの値を変更する正しい方法がわからないのです。

理想的には、私の(Jenkins)CIスクリプトでこれらの情報をすべて指定できるようにしたいのですが、バージョン番号を設定できるだけで落ち着きます。

EDIT - 詳細情報

最初の回答を読んだ後、私はサービスとNuGETパッケージの両方を作成していることを明確にしたいと思いました - そして私は、1つのファイルを更新するだけで済む古いJSONプロジェクトのような、すべてのバージョン管理の1つの方法を持つことを望みます。

アップデイト 私はCSPROJファイルへの変更をスクリプトで行うつもりですが、私の意見では、私が変更する必要があるセクションは次のように見えるので、かなり厄介です...。

<PropertyGroup>
 <OutputType>Exe</OutputType>
 <TargetFramework>netcoreapp1.1</TargetFramework>
 <Version>1.0.7777.0</Version>
 <AssemblyVersion>1.0.8888.0</AssemblyVersion>
 <FileVersion>1.0.9999.0</FileVersion>
 <Company>MyCompany</Company>
 <Authors>AuthorName</Authors>
 <Product>ProductName</Product>
 <Description />
 <Copyright>Copyright © 2017</Copyright>
</PropertyGroup>

この問題は、複数の 'PropertyGroup' 要素があることで、他の要素はラベル付けされているように見えます。

私は、パッケージの詳細が常に入力されているという前提で作業しています。値タグがない場合、どの PropertyGroup 要素に値を挿入するか (そして、これは重要であると思われるため、順序も)、明確なアイデアがありません。

私はこれより良い解決策をまだ持っています!

更新: 誰かがこの質問を重複している可能性があるとしてマークした後 ( Visual Studio 2017 (.NET Core) での自動バージョン管理について。 ) - 私はこの質問を前に見ていなかったし、今それを読むと、私がバージョン番号を設定したいだけではないことを除いて、ほとんど同じように思えます。また、この質問に対する回答は私の問題を解決していません - 私が質問で尋ねたことを尋ねるだけです。私の質問に対する回答は、まさに私の問題を解決するために必要な回答です。したがって、他の質問が最初に来て、同じように見えますが、それは全く私を助けません。多分、modは助けることができる?

解決する方法は?

コマンドラインから任意のプロパティをオーバーライドするためには /p:PropertyName=Value を引数として dotnet restore , dotnet builddotnet pack .

現在、Version構成はこのように動作します。 もし Version が設定されていない場合は VersionPrefix (未設定の場合、デフォルトは 1.0.0) を使い、存在すれば VersionSuffix .

他のすべてのバージョンは、デフォルトで Version になります。

ですから、例えば以下のように設定することができます。 <VersionPrefix>1.2.3</VersionPrefix> を設定し dotnet pack --version-suffix beta1 を生成するために YourApp.1.2.3-beta1.nupkg (を生成します(バージョンサフィックスを適用させたいプロジェクト参照がある場合は dotnet restore /p:VersionSuffix=beta1 を呼び出す必要があります - これはツールの既知のバグです)。

もちろん、カスタム変数も使うことができます。 このGitHubの課題 をご覧ください。

サポートされるアセンブリ属性の完全なリファレンスについては、ビルドロジックのソースコードを参照することをお勧めします。 ここで (で囲まれた値は $() で囲まれた値が使用されるプロパティです)。 そして、もうソースの話になってしまいますが この はバージョンと他のいくつかのプロパティを構成するロジックです。