gpt4 book ai didi

.net - 在 Linux 上构建面向 .NET Framework 的 NuGet 包

转载 作者:IT王子 更新时间:2023-10-29 00:22:53 29 4
gpt4 key购买 nike

我想创建一个 NuGet 包,它可以同时显式地面向 .NET Framework 4.6.2 和 .Net Standard 1.5。这是来自 VS 2017 的缩写 .csproj 文件:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net462;netstandard1.5</TargetFrameworks>
...
</PropertyGroup>

</Project>

当我从我的本地 Windows 计算机执行 dotnet build 和 pack 命令时,NuGet 包的创建完全符合预期。

但是,当我尝试在 Linux 上执行相同的 dotnet 命令时,我收到以下错误:

/opt/dotnet/sdk/1.0.4/Microsoft.Common.CurrentVersion.targets(1111,5): error MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.6.2" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.

然后我突然意识到 Linux 机器上没有任何常规的 .NET Framework 程序集(更不用说 .用于“目标包”,但它仅适用于 Windows。

冒着听起来幼稚的风险,有人在 Linux 上成功构建了可以面向 .NET Framework 的 NuGet 包吗?

最佳答案

.NET CLI 的分发版不包含任何 .NET Framework 的引用程序集,因此其 MSBuild 版本无法解析所需的编译时 Assets 。这个场景是tracked on GitHub虽然并且在迁移到 MSBuild 之前已经工作(CLI 可以使用 mono 的引用程序集)。

虽然有一些替代方案可用于在非 Windows 机器上构建您的库:

<强>1。使用 mono 5+ 构建库。

这可能是最稳定的路径。

Mono 5 及更高版本包含构建 .NET Standar 和 .NET Core 应用程序所需的构建逻辑。在 linux 上,mono 的 msbuild 可能需要作为单独的包安装。所以不用下面常用的命令

dotnet restore
dotnet build
dotnet publish -c Release

您将使用 mono 的 msbuild 执行以下操作:

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

单声道 < 5.2 的打包解决方法:

唯一的限制是单声道 (< 5.2) 无法生成开箱即用的 NuGet 包,但有一个 workaround involving using the NuGet.Build.Tasks.Pack NuGet package在允许你做的项目中 msbuild /t:Pack /p:Configuration=Release通过像这样修改项目文件(特别注意删除 Sdk="..." 元素上的 <Project> 属性):

<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。使用 .NET CLI 并告诉 MSBuild 使用 mono 的引用程序集。

net* 构建时目标框架,您可以设置 FrameworkPathOverride属性既可以作为环境变量也可以作为 csproj 文件中的属性。它需要指向一组引用程序集——这里可以使用mono的引用程序集。但有些包含一个特殊文件(redist 列表),其中包含对 .NET CLI 中的 MSBuild 版本无法遵循的其他目录的引用。它确实适用于很多场景:

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

这被使用并且documented by the F# team .

<强>3。使用包含引用程序集的 NuGet 包。

在某些 MyGet 源上,Microsoft 发布了包含引用程序集的 NuGet 包。尽管它们未发布或“官方”,因此此过程可能会在某个时间点失败。然而他们确实plan to investigate making this path official .

首先在您的解决方案目录中创建一个包含以下内容的 NuGet.Config 文件以添加提要:

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

然后你可以添加一个项目组来添加PackageReference到一个目标包和一个PropertyGroup像这样设置引用程序集的路径:

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

您可以更改 RuntimeIdentifier对于不同的平台,如果您使用 native Assets (例如,为 linux 获取 .so 文件)或在构建库时将其完全删除。

关于.net - 在 Linux 上构建面向 .NET Framework 的 NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44770702/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com