2017-05-12 36 views
3

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

+0

你是否看了project.json文件這應該有你正在尋找 –

+0

project.json信息不再支持和VS2017的信息可作爲'RuntimeIdentifier'財產。即使你可以使用msbuild評估來獲得它,是很棘手的。 –

回答

2

如果要發佈以多個框架爲目標的項目,則默認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 
+0

謝謝。我希望不必直接進入msbuild,但這是有效的。謝謝。 –