GNU/Linux >> Znalost Linux >  >> Linux

Sestavte balíček NuGet na Linuxu, který cílí na .NET Framework

Do souboru projektu můžete přidat následující:

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

To umožní sestavit a zabalit systémy bez systému Windows pro .NET Framework. Cíle .NET Core však můžete spouštět pouze pomocí dotnet CLI na systémech bez systému Windows. Měli byste být také připraveni vybrat cílový rámec pro spuštění na systémech bez systému Windows, jako je tento:

dotnet run -f netcoreapp2.1

Zdroj řešení:https://github.com/dotnet/designs/pull/33#issuecomment-489264196. Toto je náhradní řešení, takže se může v budoucnu změnit.


Distribuce rozhraní .NET CLI neobsahuje žádná referenční sestavení pro rozhraní .NET Framework, takže jeho verze MSBuild nemůže vyřešit potřebná aktiva v době kompilace. Tento scénář je však sledován na GitHubu a fungoval před migrací na MSBuild (CLI by mohlo používat referenční sestavení mono).

Existuje však několik alternativ, které lze použít k sestavení knihovny na počítačích bez systému Windows:

1. K vytvoření knihovny použijte mono 5+.

Toto je pravděpodobně nejstabilnější cesta.

Mono 5 a vyšší obsahuje potřebnou logiku sestavení pro vytváření aplikací .NET Standar a .NET Core. Na linuxu může být nutné nainstalovat mono's msbuild jako samostatný balíček. Takže místo následujících běžně používaných příkazů

dotnet restore
dotnet build
dotnet publish -c Release

byste použili mono's msbuild k následujícímu:

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

Zabalte řešení pro mono <5.2:

Jediným omezením je, že mono (<5.2) nemůže vytvářet balíčky NuGet ihned po vybalení, ale existuje řešení zahrnující použití NuGet.Build.Tasks.Pack Balíček NuGet v projektu, který vám umožní udělat msbuild /t:Pack /p:Configuration=Release úpravou souboru projektu takto (zejména si všimněte odstraněného Sdk="..." atribut na <Project> prvek):

<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. Použijte rozhraní .NET CLI a řekněte MSBuild, aby použil referenční sestavení mono.

Při vytváření pro net* cílové rámce, můžete nastavit FrameworkPathOverride vlastnost jako proměnná prostředí nebo jako vlastnost v souboru csproj. Musí ukazovat na sadu referenčních sestav – zde lze použít referenční sestavy mono. Některé však obsahují speciální soubor (redist list) obsahující odkazy na jiné adresáře, které verze MSBuild v .NET CLI nemůže sledovat. Funguje to však v mnoha scénářích:

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

To bylo použito a zdokumentováno týmem F#.

3. Použijte balíček NuGet obsahující referenční sestavení.

Na některých zdrojích MyGet společnost Microsoft publikuje balíčky NuGet obsahující referenční sestavení. Nejsou však zveřejněny ani „oficiální“, takže tento proces může v určitém okamžiku selhat. Nicméně plánují prošetřit, aby byla tato cesta oficiální.

Nejprve vytvořte soubor NuGet.Config v adresáři vašeho řešení s následujícím obsahem a přidejte zdroj:

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

Poté můžete přidat skupinu položek a přidat PackageReference do cílového balíčku a PropertyGroup pro nastavení cesty k referenčním sestavám takto:

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

Můžete změnit RuntimeIdentifier pro různé platformy, pokud používáte nativní podklady (např. pro získání .so soubory pro linux) nebo jej při vytváření knihoven zcela odstraňte.


Linux
  1. Správci balíčků Linux:dnf vs apt

  2. Správa balíků Linux pomocí apt

  3. Jak vytvořit balíček RPM pro Linux

  1. Linux – nainstalovat záhlaví na Kali?

  2. Cross-compiler pro Linux na Mac OS X?

  3. Jak sestavit modul jádra Linuxu tak, aby byl kompatibilní se všemi verzemi jádra?

  1. Sestavení .NET Core v linuxovém kontejneru dockeru se nezdaří kvůli ověření SSL pro Nuget

  2. Zkompilovat cíl deb-pkg linuxového jádra bez generování balíčku dbg?

  3. Odinstalování programů v Linuxu