具有多个目标框架的项目的 dotnet 发布 sln 失败

Lor*_*ori 4 target-framework .net-core dotnet-cli

我有很多项目的解决方案。一些目标框架netcoreapp2.1,一些其他目标框架netstandard2.0,一个项目有双目标框架

<TargetFrameworks>netstandard2.0;net471</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

我想要一个用于 win10 的神器,只需一个命令:

dotnet publish MySolution.sln -c Release -o "targetFolder" -r win10-x64
Run Code Online (Sandbox Code Playgroud)

使用此命令,我在使用双目标框架构建项目时遇到此错误。这是错误:

C:\Program Files\dotnet\sdk\2.1.402\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.CrossTargeting.targets(31,5) error : The 'Publish' target is not supported without specifying a target framework. The current project targets multiple frameworks, please specify the framework for the published application.
Run Code Online (Sandbox Code Playgroud)

错误很明显。最后我发现 dll 在输出目录中编译,看起来它是一个 netstandard2.0 dll,因为我的应用程序仍然可以工作。

我不喜欢肮脏的东西,那么我该如何解决我的问题呢?

如果可能的话,我会避免调用 N 次“dotnetpublish”命令。

Mar*_*ich 5

不要dotnet publish在解决方案上使用相同的输出目录。尤其是没有“-r”参数。

这是危险的,因为:

  • 库没有针对 netstandard 外观包的正确修剪行为
  • 使用“-r”发布时,库可能会出现奇怪的行为,特别是对于 netstandard<2.0 依赖项。(他们最终会复制 .NET Core 1.0/1.1 实现(!)程序集)
  • 您最终可能会在输出中得到不同的 NuGet 依赖项(传递依赖项)
  • 复制到输出/发布目录项可能最终会相互覆盖,甚至可能导致构建失败

为所有应用程序(控制台应用程序、Web 应用程序)项目单独调用它,或创建发布这些应用程序的 MSBuild 文件。

  • 我必须在同一目录中发布。所有这些项目都属于同一个应用程序。你说的很有道理,但我不明白你的解决方案。我应该使用不同的参数调用 N 次“dotnetpublish”吗?我错过了什么? (2认同)
  • 如果控制台应用程序引用这些库,它们将自动包含在内。 (2认同)