2009-02-13 76 views
2

我有一個小項目的問題,我想有該項目的2個編譯的版本:靶向不同框架的MSBuild給出了依賴

  • 一個是靶向的.NET 2.0框架
  • 一個目標是.NET 3.5框架

一切進展順利;我已經將我的項目置於持續集成(使用CC.NET)之下,並創建了2個CC.NET「項目」。每個目標框架的一個項目。

我不會在(無關緊要的)細節上做太多事情,但是我的解決方案是針對VS.NET中的.NET 3.5框架設置的。

我有2的msbuild任務:

其構建爲 .NET 3.5(簡單,容易)
  • 一個任務建立用於 .NET 2.0

    溶液中的溶液
    • 一個任務

      在這個任務中,我打電話給MSBuild,並且指定TargetFrameworkVersion應該是v2.0。我還定義了一些額外的構建條件(因此,.NET3.5特定的代碼不會構建在面向.NET2.0的組件中)。

    到目前爲止,這麼好。一切正常。 現在,問題是這樣的:

    我的解決方案有一些依賴關係(引用第三方程序集)。在VS.NET中,我爲這些依賴項設置了「copy local」爲true。 當CC.NET構建我的.NET3.5版本的程序集時,第三方依賴關係確實被複制到我的輸出目錄中。

    但是,當CC.NET構建我的.NET2.0版本的程序集時,依賴項不會複製到我的輸出目錄中。 (然後,這會導致我的單元測試失敗)。

    我現在的問題是: 如何建立我的項目的.NET2.0版本時,我可以說msbuild某些第三方引用必須複製本地? 或者,有沒有其他方法可以實現這一點,因爲我不想在構建腳本中再次指定每個依賴項。我想這很快就會成爲維修的噩夢。

  • 回答

    1

    我已經能夠解決這個問題,確保我沒有從GAC中引用程序集。 相反,我在包含第三方程序集的項目中創建了一個'lib'目錄。 在我的解決方案中,我從那裏引用第三方程序集,並設置複製本地== True。

    除此之外,您還必須確保在您的csproj文件中,引用的程序集具有一個其值設置爲true的私有標籤。 像這樣:

    <Reference Include="..."> 
        <SpecificVersion>False</SpecificVersion> 
        <HintPath>...</HintPath> 
        <Private>True</Private> 
    </Reference> 
    
    +0

    +1:非常感謝。 – ccellar 2011-08-19 22:18:04

    2

    我已經再次重新審視這個問題,因爲我不喜歡必須手動更改的csproj文件。 (當我更改我的參考時,我不能忘記再次調整csproj文件,將專用節點重新設置爲真)。

    所以,我已經挖成MSDN,我偶然發現了這一點:

    ResolveAssemblyReference.TargetFrameworkDirectories 物業

    備註此屬性是必需的,以確定CopyLocal狀態 生成的項目。

    如果未指定此屬性,沒有 造成項目將有一個真 CopyLocal值,除非他們明確 對他們的源項目的真正私有的元數據 值。

    因此,這意味着還有另一種可能性,那就是設置ResolveAssemblyReference任務的TargetFrameworkDirectories。 但是,有沒有人知道如何做到這一點?
    我一直在嘗試不同的東西,但似乎沒有任何工作...

    我已經試過這樣:

    <ItemGroup> 
        <TargetFrameworkDir Include="$(SystemRoot)\Microsoft.NET\Framework\v2.0.50727" /> 
    </ItemGroup> 
    
    <PropertyGroup> 
        <TargetDirsToUse>@(TargetFrameworkDir)</TargetDirsToUse> 
    </PropertyGroup> 
    
    <ResolveAssemblyReference TargetFrameworkDirectories="$(TargetDirsToUse)" /> 
    

    但無濟於事...... 也許別人知道如何做到這一點,或有一個黃金小費。 (我在這個問題上花費了很多時間)。

    0

    一個問題:如果您嘗試在VisualStudio中編譯2.0解決方案/項目會發生什麼?第三方引用是否被自動複製?

    這很奇怪,這將適用於3.5而不是2.0。我自己並沒有進行任何並行構建,但是當我將項目從2.0轉換爲3.5時,無論.NET版本如何,都會複製所有第三方引用。

    參考文獻:I 從來沒有參考來自GAC的第三方庫(只有那些來自微軟,甚至不是所有人)。我總是將它們複製到我的lib目錄結構,將它們添加到源代碼管理並從那裏引用它們。就我而言,使用GAC中的程序集是不好的做法,因爲它代表了對開發機器設置的不必要依賴。

    這樣一個目錄的例子:http://code.google.com/p/projectpilot/source/browse/#svn/trunk/lib

    +0

    當我從VS.NET針對.NET 2.0構建時,資源正在本地複製(就像我想的那樣)。 當我讓CC.NET使用我的msbuild buidscript構建解決方案,以.NET2.0爲目標時,引用的程序集不會在本地複製。當它的構建目標是3.5(就像在VS.NET中指定的那樣)時,組件被複制。 我想我會檢查csproj和sln文件,看看裏面指定了什麼。 我也沒有引用任何來自GAC的第三方程序集。我有我的依賴在一個lib目錄中,我從那裏引用它們。 (就像你一樣) – 2009-07-02 07:43:36