Anda cukup menambahkan yang berikut ke file proyek Anda:
<ItemGroup Condition="$(TargetFramework.StartsWith('net4')) AND '$(MSBuildRuntimeType)' == 'Core' AND '$(OS)' != 'Windows_NT'">
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>
Ini akan memungkinkan untuk membangun dan mengemas pada sistem non-windows untuk .NET Framework. Tetapi Anda hanya dapat menjalankan target .NET Core menggunakan dotnet
CLI pada sistem non-windows. Jadi, Anda juga harus siap memilih framework target untuk dijalankan pada sistem non-windows, seperti ini:
dotnet run -f netcoreapp2.1
Sumber solusi:https://github.com/dotnet/designs/pull/33#issuecomment-489264196. Ini adalah solusi, sehingga dapat berubah di masa mendatang.
Distribusi .NET CLI tidak berisi rakitan referensi apa pun untuk .NET Framework sehingga versi MSBuild tidak dapat menyelesaikan aset waktu kompilasi yang diperlukan. Skenario ini dilacak di GitHub dan telah berfungsi sebelum migrasi ke MSBuild (CLI dapat menggunakan rakitan referensi mono).
Ada beberapa alternatif yang dapat digunakan untuk membangun pustaka Anda di mesin non-windows:
Ini mungkin jalur yang paling stabil.
Mono 5 dan lebih tinggi berisi logika build yang diperlukan untuk membangun aplikasi .NET Standar dan .NET Core. Di linux, msbuild mono mungkin perlu diinstal sebagai paket terpisah. Jadi alih-alih menggunakan perintah berikut yang umum digunakan
dotnet restore
dotnet build
dotnet publish -c Release
Anda akan menggunakan msbuild mono untuk melakukan hal berikut:
msbuild /t:Restore
msbuild
msbuild /t:Publish /p:Configuration=Release
Kemas solusi untuk mono <5.2:
Satu-satunya batasan adalah bahwa mono (<5.2) tidak dapat menghasilkan paket NuGet di luar kotak tetapi ada solusi yang melibatkan penggunaan NuGet.Build.Tasks.Pack
Paket NuGet dalam proyek yang memungkinkan Anda melakukan msbuild /t:Pack /p:Configuration=Release
dengan memodifikasi file proyek seperti ini (terutama perhatikan Sdk="..."
yang dihapus atribut pada <Project>
elemen):
<Project>
<PropertyGroup>
<NuGetBuildTasksPackTargets>junk-value-to-avoid-conflicts</NuGetBuildTasksPackTargets>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<!-- All your project's other content here -->
<ItemGroup>
<PackageReference Include="NuGet.Build.Tasks.Pack" Version="4.0.0" PrivateAssets="All" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>
Saat membangun untuk net*
kerangka target, Anda dapat mengatur FrameworkPathOverride
properti baik sebagai variabel lingkungan atau sebagai properti di file csproj. Perlu menunjuk ke satu set rakitan referensi - rakitan referensi mono dapat digunakan di sini. Tetapi beberapa berisi file khusus (daftar redist) yang berisi referensi ke direktori lain yang tidak dapat diikuti oleh versi MSBuild di .NET CLI. Itu memang berfungsi dalam banyak skenario:
export FrameworkPathOverride=/usr/lib/mono/4.5/
dotnet build -f net45
Ini digunakan dan didokumentasikan oleh tim F#.
Pada beberapa feed MyGet, Microsoft menerbitkan paket NuGet yang berisi rakitan referensi. Mereka tidak dipublikasikan atau "resmi" sehingga proses ini mungkin gagal pada suatu saat. Namun mereka berencana untuk menyelidiki membuat jalur ini resmi.
Pertama buat file NuGet.Config di direktori solusi Anda dengan konten berikut untuk menambahkan feed:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
</packageSources>
</configuration>
Kemudian Anda dapat menambahkan grup item untuk menambahkan PackageReference
ke paket penargetan dan PropertyGroup
untuk menyetel jalur ke rakitan referensi seperti ini:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net461' ">
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
<FrameworkPathOverride>$(NuGetPackageFolders)microsoft.targetingpack.netframework.v4.6.1\1.0.1\lib\net461\</FrameworkPathOverride>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<PackageReference Include="Microsoft.TargetingPack.NETFramework.v4.6.1" Version="1.0.1" ExcludeAssets="All" PrivateAssets="All" />
</ItemGroup>
</Project>
Anda dapat mengubah RuntimeIdentifier
untuk platform yang berbeda jika Anda menggunakan aset asli (misalnya untuk mendapatkan .so
file untuk linux) atau hapus seluruhnya saat membangun perpustakaan.