21

我讀過的職位的少數(見下面的參考資料),還沒有找到最佳實踐指南,是專門針對我的技術堆棧。有沒有推薦的方法來配置NuGet包使用的MSBuild在TeamCity的針對多個框架?

目標:使用MSBuild和NuGet通過TeamCity創建一個單一的NuGet包,其目標是通過一個.csproj文件構建的多個.NET框架。

約束:

  1. 代碼從VCS拉只有一次。
  2. 所有編譯組件時,應當進行版本相同。
  3. 單.csproj的(而不是每個目標框架)。

我心裏有兩種方法:

  1. 創建一個單一的生成配置。它將包含三個構建步驟:編譯.NET 3.5,編譯.NET 4.0,包裝NuGet。每個構建步驟都取決於最後的成功。我用這種方法看到的唯一真正的問題(希望有一個我不知道的解決方案)是每個構建步驟都需要它自己的一組構建參數(例如,system.TargetFrameworkVersion和system.OutputPath)來指定DLL的獨特位置(例如,bin \ release \ v3.5和bin \ release \ v4.0),以便NuGet pack步驟能夠基於.nuspec文件中的Files部分完成它的工作。

  2. 創建多個構建配置。按照上面概述的構建步驟構建一個配置。使用這種方法,很容易解決TargetFrameworkVersion和OutputPath構建參數問題,但是現在我必須創建快照依賴性並在構建中共享程序集版本號。它也吃了構建配置插槽,因爲我們確實有一個企業許可證這是確定(但不是最優的)我們。

選項#1似乎是明顯的選擇。選項#2感覺髒。

所以我的兩個問題是:

  1. 是否有可能創建出獨特的生成步驟的參數?
  2. 有沒有第三種更好的方法?

參考文獻:

  1. Multi-framework NuGet build with symbols for internal dependency management
  2. Nuget - packing a solution with multiple projects (targeting multiple frameworks)
  3. http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/
  4. http://msdn.microsoft.com/en-us/library/hh264223.aspx
  5. https://stackoverflow.com/a/1083362/607701
  6. http://confluence.jetbrains.com/display/TCD7/Configuring+Build+Parameters
  7. http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package
+0

我已經實現了兩種方法的解決方案,並會盡快發佈單獨的答案(如時間允許)。 – 2013-04-15 21:31:12

+0

我正在等待着誘餌的呼吸;-)巧合的是我只是有相同的要求。 – 2013-04-17 02:00:17

+0

哈哈,蒂姆。我從組裝信息youtrack討論中識別出你的名字(http://youtrack.jetbrains.com/issue/TW-27596)。你和我正在遵循同樣的問題。我會盡力在本週發佈我的兩個答案。 ;) – 2013-04-17 02:52:49

回答

24

這是我的優選解決方案(選項#1):

魔術依賴於一個不幸的解決方法。如果你願意做出妥協,這個解決方案確實有效。如果你不是,你可以按照the issue that I opened on JetBrains' issue tracker

單生成配置是這樣的:

enter image description here

注意的前兩個構建步驟的名稱。事實上,它們分別被明確命名爲.NET 3.5和4.0的TargetFrameworkVersion值。

然後,在構建參數部分,我已經配置下列參數:

enter image description here

最後,的NuGet包的步驟根據我.nuspec的文件部分做的文件路徑翻譯:

<files> 
    <file src="bin\release\v3.5\*.*" target="lib\net35" /> 
    <file src="bin\release\v4.0\*.*" target="lib\net40" /> 
</files> 
+1

+1這兩個答案,因爲你花時間寫一個完整的手冊 – stijn 2013-07-12 09:46:13

+0

這裏是另一種不涉及任何TeamCity參數的方法,完全使用Visual Studio項目構建配置,nuspec和Team City構建完成:http:// stackoverflow.com/questions/40046710/teamcity-nuget-package-build-for-different-net-frameworks/40111795 – 2016-10-26 18:02:59

14

這裏是採取第二種方法的解決方案:

該項目包含以下生成的配置和模板:

enter image description here

的共享版本號生成器是鏈中的第一個版本。除了創建依賴版本將共享的內部版本號之外,它什麼也不做。我使用Nicholas Williams提供的TeamCity引用的插件Shared Build Number

這裏是在構建模板顯着的配置:

enter image description here

注意版本號從共享的版本ID來構建數發生器如上所述。因此,就我而言,該構建的ID爲14.還要注意工件路徑中的變量%TargetFrameworkVersion%。幸運的是,TeamCity幾乎支持各種插值。

爲了使模板利用內部版本號,它必須有對構建配置的快照依賴:(關於模板)

enter image description here

最後,構建參數幾乎相同到我的首選解決方案中的參數。但是請注意附加的配置參數。這是將被繼承構建配置覆蓋:

enter image description here

然後,在相關的版本,您必須連接起來快照依賴關係,內部版本號(從模板繼承)實際上也適用服用上的共享版本號構建配置的依賴關係:

enter image description here

,當然,你需要設置實際的目標框架:

enter image description here

通過配置實際版本,您現在可以配置NuGet pack版本配置。你並不需要連接到一個VCS根:

enter image description here

但是,你需要配置了一堆的依賴(包括快照和神器):

enter image description here

最後,你完成了。

+1

我有同樣的問題,並使用您的解決方案的版本。但是,當我所構建的組件使用NuGet包時,我遇到了問題。我的目標是v4.0和v4.5,並且我對EntityFramework 6.x有依賴性。當我構建我的4.0版本的MY包時,我希望它使用相同版本的EF。我還沒有嘗試過不同的重新安裝場景,但從我的研究來看,他們似乎有缺陷。 – bigfoot 2014-02-17 13:02:11

相關問題