0 と 1 の世界の見習い探検家

タグ:VisualStudio

20240125-01_netsdk1054errormsg

.NET Standard で NuGet 用のパッケージ (*.nupkg) を出力しようとした際、下記エラーが発生して出力できなかったときの備忘録。

.NET Standard で「パック」を行おうとしたところ、下記エラーメッセージが表示され出力に失敗しました。
NETSDK1054: .NET Core のみがサポートされています。

対象の .NET Standard プロジェクトのプロパティを開き、[パッケージ] > [全般] > 「.NET ツールとしてパック」の項目を探す。
間違えてチェックをオンにしてしまったようだが、下記は .NET Standard のプロジェクトでは非対応のようなので、チェックを外してください。

20240125-02_check

エラーの言っている .NET Core のみのサポートの話を参照している外部の NuGet パッケージのバージョンの問題だと誤解して、一生懸命バージョンを下げたりしていたが、なんのこともなかった……。

どうもこんにちは、青砥です。
最近発見して便利だと思ったナレッジを共有します。

アセンブリのバージョンなどでビルド時の日時を使用する方法について書き遺しておきます。


awpioetvj4tj-02
図 1 ビルド結果

Visual Studio のプロジェクトのプロパティで、アセンブリや NuGet Package (*.nupkg) のバージョンを指定するかと思いますが、ここで「ビルド時の日時」を使用した動的なバージョン番号の生成を可能にする方法を見つけました。

まずは結論から。
$([System.DateTime]::Now.ToString('0.yy.M.dHH'))

qad34vtuwm04t
図 2 プロジェクト プロパティでの指定


DateTime オブジェクトを ToString しているイメージです。
yy.M.dHH なので下記のようになります。

図 3 例の書式指定の場合のバージョン番号生成結果


上記は .NET Standard 2.0 ライブラリのプロジェクトのプロパティですが、おそらく Visual Studio 2022 上であれば他の .NET Framework 向けプロジェクトなどでも利用可能かと思います。


仕組み
Visual Studio ではプロジェクト プロパティで利用可能な変数のような仕組みが存在します。

(参考)
MSBuild の予約済みおよび既知のプロパティ - MSBuild | Microsoft Learn
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-reserved-and-well-known-properties?view=vs-2022

例えば、プロジェクト プロパティでは出力アセンブリ名がデフォルトではプロジェクトと同名になるよう下記のような指定になっております。

図 4 出力するアセンブリ名の指定


上記の例ではプロジェクトに関する各種値を提供する機能からプロジェクト名を値として利用しています。このような変数機能の他に「プロパティ関数」と呼ばれる動的な値の呼び出しも一部提供されているようです。

(参考)
プロパティ関数 - MSBuild | Microsoft Learn
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/property-functions?view=vs-2022

上記のページで紹介されている例を見てみるとなんとなく分かる通り、どうも PowerShell をワンライナーで実行しているようなイメージのようです。
そのため、結論に記載した通り、System.Date の Now プロパティで現在 (実行はビルド時なのでビルド時現在) の日時情報を DateTime オブジェクトで取得し、ToString メソッドで好きな形式に書式調整してあげれば、日時から動的にバージョン番号を生成することができるようになります。

DateTime の文字列化時の書式設定については下記ページをご参照ください。
(参考)
DateTime.ToString メソッド (System) | Microsoft Learn
https://learn.microsoft.com/ja-jp/dotnet/api/system.datetime.tostring?view=net-7.0

もっとわかりやすい MS 以外が公開しているドキュメントも参考になるかとは思いますがw


開発中途版などで中間成果物を短いスパンでリリースするなどの利用目的にハマると思います。

ご参考までに。

このページのトップヘ