GNU/Linux >> Belajar Linux >  >> Linux

Bangun paket NuGet di Linux yang menargetkan .NET Framework

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:

1. Gunakan mono 5+ untuk membangun perpustakaan.

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>

2. Gunakan .NET CLI dan beri tahu MSBuild untuk menggunakan rakitan referensi mono.

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#.

3. Gunakan paket NuGet yang berisi rakitan referensi.

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.


Linux
  1. Cara membuat paket rpm

  2. C # di lingkungan linux

  3. Visual Basic .Net di Linux

  1. NuGet untuk .NET Core di Linux

  2. .NET core X509Store di linux

  3. Kompilasi target deb-pkg kernel linux tanpa membuat paket dbg?

  1. Manajer paket Linux:dnf vs apt

  2. Manajemen paket Linux dengan apt

  3. Cara Menemukan Paket Yang Menyediakan File Tertentu Di Linux