如何发布所有目标框架

Eri*_*k T 4 c# msbuild csproj visual-studio .net-core

我正在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
}
Run Code Online (Sandbox Code Playgroud)

这样,每次使用新框架时,我都不需要修改构建系统.我在CLI仓库中探索过,但我找不到能满足我需要的命令.打开.csproj文件是我唯一的希望吗?

Mar*_*ich 6

如果要发布以多个框架为Publish目标的项目,则默认目标会失败,但您可以创建执行多目标的自定义目标.为此,请创建一个Directory.Build.props在解决方案文件夹中命名的文件(MSBuild> 15.1,这可以并且应该命名,Directory.Build.targets因为多目标项目存在错误):

<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>
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)