この記事では、私がどのように代わりにLinux上でモノを使用しての、.NETプロジェクトのための.NET Frameworkのバージョンを作成する方法を紹介しました。ユニバーサルは、Microsoftの新しいリリースを使用Mocrosoft.NETFramework.ReferenceAssemblies NuGetパッケージを、あなたは.NETのコアSDKに加えて任意の追加ソフトウェアパッケージをインストールする必要はありませんです!一般的には、Linuxシステム上の.NET Frameworkクラスライブラリを構築するとき、あなたは、あなたのプロジェクトファイルに次のノードを追加する必要があります。
< PackageReference 含める= "Microsoft.NETFramework.ReferenceAssemblies" PrivateAssets = "すべて" バージョン= "1.0.0-preview.2" />
背景:Linux上のフルフレームワークライブラリーの構築
あなたは.NET標準NuGetパッケージを構築している、とあなたが最高の体験をユーザーに提供する(したい場合は、いくつかの依存関係を避けるため)、その後、あなたは確認する必要がありますクロスプラットフォームの推奨の位置を。そこDOさんの多くがあり、お勧めしませんが、私はに煮詰めるする傾向がある:あなたの目標は、.NET標準のいずれかのバージョンにある場合、あなたは、少なくとも次の目的の枠組みが必要になります。
< TargetFrameworks > netstandard2.0; net461; net472 </ TargetFrameworks >
あなたの目標は、その後、標準的な1.1を.NETターゲットをビルドするためにそれを追加することであるならば、.NET Framework、.NETの標準2.0ガスケットの問題を回避するために、2つの目標が含まれていることが重要です。
理論的には完全な.NET FrameworkのターゲットのみWindows上で構築することができます-これは多くの問題を提起します。で前の記事、私はそれが提供するモノアセンブリをインストールして使用することによってこの問題を解決する方法を示しました。ではその記事は、私はまた、Linuxの.NET Frameworkのテストスイートで実行されている実証しました。これまでのところ、それは私のために非常に有効であるが、それはいくつかの欠点があります。
- それはモノをインストールする必要があります
- 少しハック.propsファイルを追加する必要があります
- それは公式のサポートを得ることはありませんので、それが動作しない場合は、方法を考える必要はあり
.propsファイル FrameworkPathOverride MSBuildの変数が我々の方法を構築することが可能であるモノ参照アセンブリ、に設定されています。ではなく、コメントにジョンスキートは指摘し、モノが本当に必要ではありません。私達はちょうど簡単にコンパイルアセンブリへの参照を取得する方法が必要です。これは、Microsoftによって提供され Microsoft.NETFramework.ReferenceAssembliesのパッケージ。
NuGet設定手順使用することによりMicrosoft.NETFramework.ReferenceAssembliesを
私が見ムハンマド・サイード・Rehanをこのツイートを前に、私は気付かなかったMicrosoft.NETFramework.ReferenceAssemblies NuGetパッケージを。この情報は、完全な.NET FrameworkクラスライブラリはLinuxだけで.NETのコアSDKをインストールする必要が素晴らしい建物です!
例を挙げましょう。
あなたは使用することができます DOTNET新しいCLASSLIBを 以下に示すように.csprojファイルを提供します.NETのコアライブラリを作成します:
< プロジェクトSDK = "Microsoft.NET.Sdk" > < PropertyGroup > < TargetFrameworks > netstandard2.0 </ TargetFrameworks > </ PropertyGroup > </ プロジェクト>
.csprojプロジェクトファイルを変更し、構築するためのより多くのゴールを追加します。
< プロジェクトSDK = "Microsoft.NET.Sdk" > < PropertyGroup > < TargetFrameworks > netstandard2.0; net461; net472 </ TargetFrameworks > </ PropertyGroup > </ プロジェクト>
あなたは、Linux上で、この時間を使用しようとすると DOTNETビルド 、次のようなエラーが表示されます。
/ usr / share / DOTNET / SDK / 2.1。700 /Microsoft.Common.CurrentVersion.targets(1175、5 ): エラーMSB3644:参照アセンブリのためのフレームワークは、 " .NETFramework、バージョン= v4.6.1が" 見つかりませんでした。これを解決するには、インストール SDKをまたはパックをターゲットにするために、このフレームワークの バージョンやフレームワークのバージョンにアプリケーションを再ターゲットするために どのあなたが持っている SDKやパックがインストールされてターゲットを。アセンブリから解決されることに注意してください 、グローバルアセンブリキャッシュ(GAC)と使用されるに参照アセンブリの場所。 したがって、あなたのアセンブリは、正確に標的されないことのためにあなたが意図するフレームワーク。
そして最後に奇跡の瞬間を目撃します。プロジェクトファイルにMicrosoft.NETFramework.ReferenceAssemblies NuGetパッケージを追加します。
< プロジェクトSDK = "Microsoft.NET.Sdk" > < PropertyGroup > < TargetFrameworks > netstandard2.0; net461; net472 </ TargetFrameworks > </ PropertyGroup > <! - この参照を追加します- > < ItemGroup > < PackageReference 含めます= "Microsoft.NETFramework.ReferenceAssemblies" PrivateAssets = "すべて" バージョン= "1.0.0-preview.2" /> </ ItemGroup > </ プロジェクト>
再び実行 DOTNETビルドを 、実際に成功を構築しました。
ビルドに成功しました。 0 警告(秒) 0エラー(S)
使用PrivateAssets機能は、依存プロジェクトまたは公開NuGetパッケージにMicrosoft.NETFramework.ReferenceAssembliesパッケージ「漏れ」を防止;それは、ビルドにのみ依存しています。
単にモノをインストールするよりも良い経験を得ることができ、プロジェクトにパッケージを追加します。最も重要なのは、このメソッドは、.NETのコア支持体上に、今からになります。そして、それは、必要に応じて、.NETのコアSDKは自動的に、このパッケージを参照しますので、理論的には、我々は手動で.NET Frameworkプロジェクトをビルドするノードのプロジェクトを追加するために設定ファイルを編集する必要はありません、.NETのコア3.0 SDKに良くなります!
メタパッケージ、.targets、およびDLLの多くを:それはどのように動作します
あなたが仕事のパッケージに興味があるなら、私はあなたが読むことをお勧め関連する質問を、私はここでは、高レベルの概要を提供します。
私たちは、意志Microsoft.NETFramework.ReferenceAssemblies NuGetパッケージ自体が始まります。このパッケージには、コードが含まれていないメタパッケージですが、.NET Frameworkのサポートされているバージョンごとに異なるNuGetパッケージに依存しています:
例如:以 .NET Framework 4.6.1 为目标时将依赖 Microsoft.NETFramework.ReferenceAssemblies.net461。此方法可以确保您只会下载到与目标框架一致的 NuGet 包。
如果你打开一个特定 Framework 的 NuGet 包,你会在 build 文件夹中发现两件事:
- 一个 .targets 文件
- 一个 .NETFramework 文件夹,其中包含引用的全部程序集(> 100MB)
.targets 文件与我上一篇文章中的 .props 文件的用途类似 - 它告诉 MSBuild 在哪里可以找到框架库。以下示例来自.NET 4.6.1包:
<Project> <PropertyGroup Condition=" ('$(TargetFrameworkIdentifier)' == '.NETFramework') And ('$(TargetFrameworkVersion)' == 'v4.6.1') "> <TargetFrameworkRootPath>$(MSBuildThisFileDirectory)</TargetFrameworkRootPath> <!-- FrameworkPathOverride is typically not set to the correct value, and the common targets include mscorlib from FrameworkPathOverride. So disable FrameworkPathOverride, set NoStdLib to true, and explicitly reference mscorlib here. --> <EnableFrameworkPathOverride>false</EnableFrameworkPathOverride> <NoStdLib>true</NoStdLib> </PropertyGroup> <ItemGroup Condition=" ('$(TargetFrameworkIdentifier)' == '.NETFramework') And ('$(TargetFrameworkVersion)' == 'v4.6.1') "> <Reference Include="mscorlib" Pack="false" /> </ItemGroup> </Project>
这会将 TargetFrameworkRootPath 参数设置为包含 .targets 文件的文件夹。MSBuild 遍历 NuGet 包的文件夹结构(.NETFramework \ v4.6.1),找到dll,并找到引用程序集:
我已经使用.NET Core 2.1 SDK 和 2.2 SDK 测试了这些软件包,并且它的工作时间都非常出色。试试看!
Reference