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.