如何发布所有目标框架

时间:2017-05-12 23:09:24

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

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

1 个答案:

答案 0 :(得分:5)

如果要发布面向多个框架的项目,默认的var inputList = new List<string>() { "Bananas!", "Cherry2", "Mango","Apples", "Grape$", "Guava" }; var outputList = inputList.OrderBy(s => s.Last(c => char.IsLetter(c))); Console.WriteLine(string.Join("~", outputList)); 目标会失败,但您可以创建一个自定义目标来执行多目标。为此,请在解决方案文件夹中创建一个名为Publish的文件(MSBuild&gt; 15.1,这可以并且应该命名为Directory.Build.props,因为was a bug with multi-targeting projects}:

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>