如何为所有目标框架发布

How to publish for all target frameworks

我正在 TeamCity 中为 .Net Core 项目构建一组构建模板。除了控制台项目外,一切都运行良好。问题是当我去发布解决方案时,我需要指定框架版本。在构建的任何其他阶段,我都不需要了解框架。至少在发布 .sln 文件时是这样,控制台项目只有一个目标框架。

所以现在我需要弄清楚控制台项目应该针对哪个框架。我可以阅读各种 XML 文件,但我希望我不需要。是否有一些内置方法可以查询给定解决方案所使用的框架?

例如,类似 (PowerShell)

$frameworks = & dotnet.exe --<what I want> .\MySolution.sln
for ($framework in $frameworks) {
  & dotnet.exe publish -f $framework .\MySolution.sln
}

这样我就不需要在每次使用新框架时都修改构建系统。我在 CLI 存储库中四处寻找,但找不到满足我需要的命令。打开 .csproj 文件是我唯一的希望吗?

如果您想发布针对多个框架的项目,默认 Publish 目标会失败,但您可以创建一个自定义目标来执行多目标本身。为此,请在解决方案文件夹中创建一个名为 Directory.Build.props 的文件(对于 MSBuild > 15.1,这可以而且应该命名为 Directory.Build.targets 因为那里有 was a bug with multi-targeting projects):

<Project>
  <Target Name="PublishProjectIfFrameworkSet"
          DependsOnTargets="Publish"
          Condition=" '$(TargetFramework)' != '' " />

  <Target Name="PublishProjectForAllFrameworksIfFrameworkUnset" Condition=" '$(TargetFramework)' == '' ">
    <ItemGroup>
      <_PublishFramework Include="$(TargetFrameworks)" />
    </ItemGroup>
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="Publish" Properties="TargetFramework=%(_PublishFramework.Identity)" />
  </Target>

  <Target Name="PublishAll"
          DependsOnTargets="PublishProjectIfFrameworkSet;PublishProjectForAllFrameworksIfFrameworkUnset" />
</Project>

然后您可以通过在解决方案目录中执行以下命令来发布所有已定义框架的项目:

$ dotnet msbuild /t:PublishAll /p:Configuration=Release
Microsoft (R) Build Engine version 15.1.1012.6693
Copyright (C) Microsoft Corporation. All rights reserved.

  app2 -> /Users/martin/testproj/app2/bin/Release/netcoreapp1.1/app2.dll
  app1 -> /Users/martin/testproj/app1/bin/Release/netcoreapp1.1/app1.dll
  app1 -> /Users/martin/testproj/app1/bin/Release/netcoreapp1.0/app1.dll