2011-07-20 30 views
2

我試圖改進我們的構建過程,爲此我一直在關注複製本地並將整個解決方案構建到一個通用的\ bin目錄。使用CopyLocal管理VS2010引用= False

然而,什麼是不再複製引用到bin目錄的最佳做法?我不想在其中一個實際的實施項目中這樣做,因爲其中許多項目使用相同的引用組件,並且這意味着後期構建步驟的激增。

我知道我可以創建一個自定義的msbuild文件,但那需要在Visual Studio之外手動運行(我認爲)?這似乎是摩擦。有沒有一種方法可以創建一個msbuild項目,然後將其作爲我的解決方案的一部分。

還是最好只在我的解決方案構建之外進行管理,並且有一個copy_references.bat文件,dev需要運行一次才能設置其環境,使其進入/ bin/debug和/ bin/release目錄?這看起來有點脆弱,但是比直接檢查/ bin和將文件轉換爲svn好。

我有一個想法是創建一個空的c#組件項目,並添加引用到它,複製本地打開。如果這是所有其他項目的依賴項,它將管理複製。

下一個問題是如何用nuget引用來管理這個問題?我的首選是不檢查參考到svn,但告訴nu​​get抓住他們。因此,這也需要成爲構建步驟,但同樣需要解決方案層面的問題。

附加信息

對於有點爲什麼我正在評估這種方法更多的背景,看看這裏:

http://www.ndepend.com/Res%5CNDependWhiteBook_Assembly.pdf

的目標是通過停止大規模加快編譯時間所有這些冗餘副本。如果它有效,也可以不需要手動解決時間依賴性評估不起作用。導致必須將引用程序集的依賴項拉入頂級項目,以確保它們最終位於bin文件夾中。

我想在某些方面關閉複製本地的願望是ms構建過程在追蹤依賴性和評估需要複製事件時效率低下的人爲因素。

+1

你*不*改進構建過程。 –

+0

因爲我不知道你指的是哪一方面,所以你需要在這裏增加任何值。你是複製本地粉絲嗎? – DanH

+0

同意@Hans,表面聽起來很糟糕......您試圖通過鞏固所有項目輸出的實現細節來滿足什麼[非]功能要求? –

回答

2

您可以覆蓋全局的$(OutDir)屬性並保持CopyLocal啓用。由於每個項目都複製到相同的$(OutDir),因此您不會因爲重複過多而導致複製。這非常簡單。

還有更多的參與,您還可以創建一個共享導入文件,將其導入標準構建並執行自定義構建後部署。例如,

<Target Name="Deploy" 
    DependsOnTargets="Deploy)" 
    AfterTargets="Build"> 

    ... copy all output files ... 
    e.g. use wildcards $(OutDir)\*.dll 
    e.g. $(OutDir)\$(TargetName)$(TargetExt) 
    e.g. copy referenced assemblies and copy, see below 
</Target> 

要獲得引用,你可以調用ResovleAssemblyReferences目標和使用收益,或者創建自己的目標,以獲得特定集合如圖這裏的答案, Return the ReferenceCopyLocalPaths from <MSBuild> task 可以相當複雜,但如果您可以使用元數據在項目數組中聲明您自己的「規則」,則可以輕鬆進行配置。

+0

保留副本本地爲true的事情是,它會減慢構建,因爲msbuild在執行副本之前沒有進行檢查,因此在每次構建期間將相同的文件複製n次。更多細節在我添加到問題的鏈接中。我認爲你的解決方案參考目標可能會有所幫助。唯一的問題是我想將它作爲一個解決方案級別的項目運行,我認爲這在開發工作室中是不可能的。看起來像最簡單的方法是有一個虛擬項目的引用,其中有複製本地真正的方式,它們都保留在IDE中,並與msbuild一起使用。而其他方法在IDE中不起作用。 – DanH