.NET CLI 的分发不包含任何 .NET Framework 的参考程序集,因此其 MSBuild 版本无法解析所需的编译时资产。这种情况是 tracked on GitHub,但在迁移到 MSBuild 之前已经有效(CLI 可以使用 mono 的参考程序集)。
虽然有一些替代方案可用于在非 Windows 机器上构建库:
1.使用 mono 5+ 构建库。
这可能是最稳定的路径了。
Mono 5 及更高版本包含构建 .NET Standard 和 .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
单声道
唯一的限制是 mono (workaround involving using the NuGet.Build.Tasks.Pack NuGet package 允许您通过像这样修改项目文件来执行 msbuild /t:Pack /p:Configuration=Release(特别注意删除了 <Project> 元素上的 Sdk="..." 属性):
<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>
如果您使用本机资产(例如为 linux 获取 .so 文件),您可以针对不同平台更改 RuntimeIdentifier,或者在构建库时将其完全删除。