【问题标题】:How to publish for all target frameworks如何为所有目标框架发布
【发布时间】:2017-10-12 08:32:43
【问题描述】:

我正在 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 文件是我唯一的希望吗?

【问题讨论】:

  • 你看过project.json文件了吗,里面应该有你要找的信息
  • project.json 不再受支持,对于 VS2017,该信息可作为 RuntimeIdentifier 属性获得。即使您可以使用 msbuild 评估来获取它,这也很棘手..

标签: c# visual-studio msbuild .net-core csproj


【解决方案1】:

如果您要发布面向多个框架的项目,默认的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

【讨论】:

  • 谢谢。我希望不必直接陷入 msbuild,但这有效。谢谢。
  • 我的想法完全是@ErickT... MSBuild 是 .NET 生态系统的 JavaScript。 :P 似乎这里只会有一个--framework * 或等价物。
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
相关资源
最近更新 更多