GNU/Linux >> Linux Esercitazione >  >> Linux

Compila il pacchetto NuGet in Linux destinato a .NET Framework

Puoi semplicemente aggiungere quanto segue al tuo file di progetto:

  <ItemGroup Condition="$(TargetFramework.StartsWith('net4')) AND '$(MSBuildRuntimeType)' == 'Core' AND '$(OS)' != 'Windows_NT'">
    <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
  </ItemGroup>

Ciò consentirà di compilare e comprimere su sistemi non Windows per .NET Framework. Ma è possibile eseguire solo destinazioni .NET Core utilizzando dotnet CLI su sistemi non Windows. Quindi dovresti anche essere pronto a selezionare un framework di destinazione da eseguire su sistemi non Windows, come questo:

dotnet run -f netcoreapp2.1

Fonte della soluzione:https://github.com/dotnet/designs/pull/33#issuecomment-489264196. Si tratta di una soluzione alternativa, quindi è soggetta a modifiche in futuro.


La distribuzione dell'interfaccia della riga di comando di .NET non contiene assembly di riferimento per .NET Framework, pertanto la relativa versione di MSBuild non è in grado di risolvere le risorse necessarie in fase di compilazione. Questo scenario è tuttavia tracciato su GitHub e ha funzionato prima della migrazione a MSBuild (l'interfaccia a riga di comando potrebbe utilizzare gli assembly di riferimento di mono).

Tuttavia, ci sono alcune alternative che possono essere utilizzate per costruire la tua libreria su macchine non Windows:

1. Usa mono 5+ per costruire la libreria.

Questo è probabilmente il percorso più stabile.

Mono 5 e versioni successive contengono la logica di compilazione necessaria per creare applicazioni .NET Standard e .NET Core. Su Linux, potrebbe essere necessario installare msbuild di mono come pacchetto separato. Quindi, invece dei seguenti comandi comunemente usati

dotnet restore
dotnet build
dotnet publish -c Release

useresti msbuild di mono per fare quanto segue:

msbuild /t:Restore
msbuild
msbuild /t:Publish /p:Configuration=Release

Soluzione del pacchetto per mono <5.2:

L'unica limitazione è che mono (<5.2) non può produrre pacchetti NuGet pronti all'uso, ma esiste una soluzione alternativa che prevede l'utilizzo di NuGet.Build.Tasks.Pack Pacchetto NuGet nel progetto che consente di eseguire msbuild /t:Pack /p:Configuration=Release modificando il file di progetto in questo modo (notare in particolare il file Sdk="..." rimosso). attributo sul <Project> elemento):

<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. Utilizza l'interfaccia a riga di comando di .NET e comunica a MSBuild di utilizzare gli assembly di riferimento di mono.

Durante la compilazione per net* framework di destinazione, puoi impostare FrameworkPathOverride property sia come variabile di ambiente che come proprietà nel file csproj. Deve puntare a un insieme di assembly di riferimento:qui è possibile utilizzare gli assembly di riferimento di mono. Ma alcuni contengono un file speciale (elenco redist) contenente riferimenti ad altre directory che la versione di MSBuild nell'interfaccia a riga di comando di .NET non può seguire. Funziona in molti scenari però:

export FrameworkPathOverride=/usr/lib/mono/4.5/
dotnet build -f net45

Questo è stato utilizzato e documentato dal team di F#.

3. Usa un pacchetto NuGet contenente assembly di riferimento.

In alcuni feed MyGet, Microsoft pubblica pacchetti NuGet contenenti assembly di riferimento. Non sono pubblicati o "ufficiali", quindi questo processo potrebbe fallire a un certo punto nel tempo. Tuttavia, hanno in programma di indagare per rendere ufficiale questo percorso.

Per prima cosa crea un file NuGet.Config nella directory della tua soluzione con i seguenti contenuti per aggiungere il 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>

Quindi puoi aggiungere un gruppo di articoli per aggiungere il PackageReference a un pacchetto di targeting e a un PropertyGroup per impostare il percorso degli assembly di riferimento in questo modo:

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

Puoi cambiare il RuntimeIdentifier per piattaforme diverse se utilizzi risorse native (ad es. per ottenere .so files per linux) o rimuoverlo completamente durante la creazione di librerie.


Linux
  1. Gestori di pacchetti Linux:dnf vs apt

  2. Come creare pacchetti rpm

  3. Cross-compilatore per Linux su Mac OS X?

  4. Come costruire un modulo del kernel Linux in modo che sia compatibile con tutte le versioni del kernel?

  5. La compilazione di .NET Core nel contenitore linux docker non riesce a causa dell'autenticazione SSL a Nuget

Gestione dei pacchetti Linux con dnf

Come usare pkgsrc su Linux

Linux Workstation Build nel 2019

Come compilare l'app .NET Core per Linux in un computer Windows

Compilare il target deb-pkg del kernel linux senza generare il pacchetto dbg?

Disinstallare i programmi in Linux