我正在 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
,因为多目标项目存在错误(:
<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