如何发布适用于所有目标框架的应用程序

7
我正在为 .Net Core 项目在 TeamCity 中构建一组构建模板。除了控制台项目外,一切都运作良好。问题在于当我进行发布解决方案时,我需要指定框架版本。在构建的任何其他阶段,我都不需要知道框架版本。至少对于只有一个框架目标的控制台项目来说,这是正确的,与 .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 文件了吗?这个文件应该有你要找的信息。 - Stuart Smith
project.json 已不再受支持,对于 VS2017,该信息可通过 RuntimeIdentifier 属性获得。虽然您可以使用 msbuild 评估来获取它,但这很棘手。 - Martin Ullrich
1个回答

14

如果您想发布针对多个框架的项目,那么默认的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>

然后,在解决方案目录中执行以下命令,即可将项目发布到所有定义的框架中:

$ 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

1
谢谢。我希望不必直接使用msbuild,但这个方法可行。谢谢。 - Erick T
完全同意 @ErickT 的观点......MSBuild 就像 .NET 生态系统中的 JavaScript。 :P 看起来这里只需要一个 --framework * 或等效命令就行了。 - Mike-E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接