如何在.NET Core上构建多目标解决方案?

Ser*_*kov 7 linux msbuild csproj .net-core

我有多目标csproj文件的解决方案:

<PropertyGroup>
  <TargetFrameworks>net45;netstandard1.6</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

要么

<PropertyGroup>
  <TargetFrameworks>net45;netcoreapp1.1</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我正在尝试在Linux上构建此解决方案的.NET Core部分,但无法管理它.如果我跑

dotnet build
Run Code Online (Sandbox Code Playgroud)

它构建所有目标:netcoreapp1.1,netstandard1.6并且net45在net45上失败,因为.NET Core不在Linux上提供.NET 4.5平台.我试图通过将mono指定为构建框架来解决此问题,但解决方案很复杂,而且并非所有.NET 4.5都支持单声道.但是,这可以帮助其他人避免can't find .NETFramework v4.5运行:

FrameworkPathOverride=/usr/lib/mono/4.5/ dotnet restore
FrameworkPathOverride=/usr/lib/mono/4.5/ dotnet build
Run Code Online (Sandbox Code Playgroud)

当我跑步时,dotnet build /p:TargetFramework=netcoreapp1.1我得到了很多错误,我认为因为netstandard1.6没有构建项目.

如果我通过

  dotnet build /p:TargetFrameworks=netcoreapp1.1\;netstandard1.6
Run Code Online (Sandbox Code Playgroud)

我明白了

MSBUILD : error MSB1006: Property is not valid.
Switch: netstandard1.6
Run Code Online (Sandbox Code Playgroud)

如何从命令行同时传递netcoreapp1.1netstandard1.6定位框架到msbuild?

我知道我可以添加额外的属性并根据它进行条件编译,但我不想更改csproj以使其解决方法.

Mar*_*ich 5

如果您真的不想在Linux上构建完整的框架或PCL版本,而只想要.net核心应用程序或.net标准库,则可以将项目文件(.csproj)修改为仅在Windows上具有多个目标,并且行为类似于针对非Windows上的单个框架的项目,如下所示:

<PropertyGroup>
  <TargetFrameworks>netcoreapp1.1;net45</TargetFrameworks>
  <TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netcoreapp1.1</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

这允许为所有项目分别指定非Windows窗口netstandard*netcoreapp*非Windows窗口,仅使用纯dotnet restore/ dotnet build命令即可构建应用程序的.net core仅版本。