GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erstellen Sie ein NuGet-Paket unter Linux, das auf .NET Framework abzielt

Sie können Ihrer Projektdatei einfach Folgendes hinzufügen:

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

Dies ermöglicht das Erstellen und Packen auf Nicht-Windows-Systemen für .NET Framework. Sie können jedoch nur .NET Core-Ziele mit dotnet ausführen CLI auf Nicht-Windows-Systemen. Sie sollten also auch bereit sein, ein Ziel-Framework auszuwählen, das auf Nicht-Windows-Systemen ausgeführt werden soll, wie hier:

dotnet run -f netcoreapp2.1

Quelle der Lösung:https://github.com/dotnet/designs/pull/33#issuecomment-489264196. Dies ist eine Problemumgehung und kann daher in Zukunft geändert werden.


Die Verteilung der .NET-CLI enthält keine Referenzassemblys für .NET Framework, sodass ihre Version von MSBuild die erforderlichen Ressourcen zur Kompilierzeit nicht auflösen kann. Dieses Szenario wird jedoch auf GitHub nachverfolgt und hat vor der Migration zu MSBuild funktioniert (die CLI könnte die Referenzassemblys von Mono verwenden).

Es gibt jedoch einige Alternativen, die verwendet werden können, um Ihre Bibliothek auf Nicht-Windows-Rechnern zu erstellen:

1. Verwenden Sie mono 5+, um die Bibliothek zu erstellen.

Dies ist wahrscheinlich der stabilste Pfad.

Mono 5 und höher enthält die erforderliche Buildlogik zum Erstellen von .NET Standard- und .NET Core-Anwendungen. Unter Linux muss msbuild von Mono möglicherweise als separates Paket installiert werden. Anstelle der folgenden häufig verwendeten Befehle

dotnet restore
dotnet build
dotnet publish -c Release

Sie würden msbuild von Mono verwenden, um Folgendes zu tun:

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

Problemumgehung für Mono <5.2:

Die einzige Einschränkung besteht darin, dass Mono (<5.2) keine sofort einsatzbereiten NuGet-Pakete erstellen kann, aber es gibt eine Problemumgehung, bei der NuGet.Build.Tasks.Pack verwendet wird NuGet-Paket im Projekt, mit dem Sie msbuild /t:Pack /p:Configuration=Release ausführen können indem Sie die Projektdatei wie folgt ändern (beachten Sie insbesondere die entfernte Sdk="..." Attribut auf <Project> Element):

<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. Verwenden Sie die .NET-Befehlszeilenschnittstelle und weisen Sie MSBuild an, die Referenzassemblys von Mono zu verwenden.

Beim Bauen für net* Zielframeworks können Sie den FrameworkPathOverride setzen -Eigenschaft sowohl als Umgebungsvariable als auch als Eigenschaft in der csproj-Datei. Es muss auf einen Satz von Referenzassemblys verweisen – hier können die Referenzassemblys von Mono verwendet werden. Einige enthalten jedoch eine spezielle Datei (Redist-Liste), die Verweise auf andere Verzeichnisse enthält, denen die MSBuild-Version in der .NET-CLI nicht folgen kann. Es funktioniert jedoch in vielen Szenarien:

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

Dies wurde vom F#-Team verwendet und dokumentiert.

3. Verwenden Sie ein NuGet-Paket, das Referenzassemblys enthält.

In einigen MyGet-Feeds veröffentlicht Microsoft NuGet-Pakete, die Referenzassemblys enthalten. Sie sind jedoch nicht veröffentlicht oder "offiziell", sodass dieser Prozess irgendwann fehlschlagen kann. Sie planen jedoch, diesen Weg offiziell zu untersuchen.

Erstellen Sie zuerst eine NuGet.Config-Datei im Verzeichnis Ihrer Lösung mit folgendem Inhalt, um den Feed hinzuzufügen:

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

Dann können Sie eine Artikelgruppe hinzufügen, um den PackageReference hinzuzufügen zu einem Targeting-Paket und einem PropertyGroup um den Pfad zu den Referenzassemblys wie folgt festzulegen:

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

Sie können den RuntimeIdentifier ändern für verschiedene Plattformen, wenn Sie native Assets verwenden (z. B. um .so zu erhalten Dateien für Linux) oder beim Erstellen von Bibliotheken vollständig entfernen.


Linux
  1. Linux-Paketmanager:dnf vs apt

  2. C# in Linux-Umgebung

  3. Visual Basic .Net unter Linux

  4. .NET Core-Build im Docker-Linux-Container schlägt aufgrund der SSL-Authentifizierung bei Nuget fehl

  5. Linux-Kernel-deb-pkg-Ziel kompilieren, ohne dbg-Paket zu generieren?

Linux-Paketverwaltung mit dnf

So verwenden Sie pkgsrc unter Linux

Linux-Workstation Build im Jahr 2019

So kompilieren Sie die .NET Core-App für Linux auf einem Windows-Computer

NuGet für .NET Core unter Linux

.NET Core X509Store unter Linux