2009-11-05 18 views
22

我一直在摔跤這幾天,經過大量搜索後,我找不到應該在的路徑。如何在MSBUILD中重寫.NET中引用的CopyLocal(Private)設置

我想要做的是建立一個MSBUILD項目,它將構建我們的整個.NET應用程序(8個解決方案的常量,也許有250個項目在它們之間分離),並且從各個項目文件覆蓋到許多設置爲我自己製作一個調試版本。

具體而言,我想要構建我們的發佈配置,優化關閉並生成完整的調試信息/ pdbs。另外,爲了減少我們目前超長的構建時間,我想爲每個項目的每個參考「複製本地」(或者在實際的proj文件xml中爲private)。我可以很容易地覆蓋項目級別的屬性(甚至可以使用/ p從MSBuild命令行執行此操作),但我無法弄清楚的是如何覆蓋屬性上參考。我嘗試了幾個在StackOverflow和Web上看到的東西,但沒有任何解決方案。

我可以通過更改Microsoft.Common.targets來完成我想要的操作,註釋掉_CopyFilesMarkedCopyLocal目標中的代碼會完全跳過這些文件的複製。但我不想改變我的全局配置,並在所有情況下都這樣做。我創建了我自己的替代目標文件 - 如果我改變單個項目文件指向它的話,這個文件就可以工作 - 但我無法弄清楚如何指定這個文件在頂層使用(我的.proj文件只是構建全部8種解決方案)。如果我能以某種方式覆蓋頂層的_CopyFilesMarkedCopyLocal目標,這樣就好了,這樣如果MS更改了默認目標文件,我的版本就不會搞砸了,但我無法弄清楚如何使它成爲可能。

最好的可能是如果有一種方法可以重寫參考級別屬性,比如可以投影級別屬性,而不必重寫/覆蓋構建目標的東西 - 但我沒有找到任何信息表明這是可能的。

在此先感謝您的幫助。

P.S.實際上我不可能只瀏覽所有的項目文件並改變它們;我需要一個解決方案,使現有代碼保持原樣。

+0

設置CopyLocal =假可以在部署時出現不同的問題。看到我的博客文章「不要改變」複製本地「項目引用爲false,除非明白子序列。」(http://geekswithblogs.net/mnf/archive/2012/12/09/do-not-change-copy-local -project-references-to-false-unless.aspx) – 2012-12-09 04:23:26

+0

不回答你的問題,但希望MS可以解決這個本地:https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/suggestions/ 13280400-improve-visual-studio-build-performance-for-large – Mark 2016-04-12 18:21:08

回答

29

試試這個:

設置CustomAfterMicrosoftCommonTargets到C:\ FOO \過濾器。針對(或任何你命名該文件)並有filter.targets是:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemDefinitionGroup> 
     <Reference> 
     <Private>False</Private> 
     </Reference> 
    </ItemDefinitionGroup> 
</Project> 
+4

這偉大的工作,我能簡單的添加這樣的另一個節點: 讓我的項目引用相同的行爲(而不僅僅是文件裁判) 。 – 2009-11-06 17:20:28

+4

唯一需要注意的是,它設置了''的默認值。如果它設置在任何個人''上,則該值將覆蓋此處指定的值。 – 2010-12-15 03:27:23

+1

如果在.csproj中配置它,是否有任何方法可以覆蓋該設置? – 2012-01-10 12:18:45

7

在像filter.targets文件添加一個目標:

<Target Name="BeforeBuild"> 
    <ItemGroup> 
     <ReferenceNew Include="@(Reference)"> 
      <Private>False</Private> 
     </ReferenceNew> 
     <Reference Remove="@(Reference)"/> 
     <Reference Include="@(ReferenceNew)"/> 
    </ItemGroup> 
</Target> 

這將重新創建@(參考)列表,以便在元數據「私人」設置爲false,這將確保參考沒有按」不要複製。 然後運行構建您的解決方案或項目與屬性$(CustomAfterMicrosoftCommonTargets)設置爲此filter.targets文件的路徑。

msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets 

這樣,BeforeBuild目標將得到建設項目之前調用,所有引用將進行相應的設置。如果您希望更多地控制Private是否應該爲false或true,則可以更改BeforeBuild目標並通過屬性控制它。

編輯:可能有更好的方法來設置BeforeBuild目標中的元數據。

+0

這似乎並不適用於我,它絕對運行着BeforeBuild目標(我把一個消息任務放在那裏檢查以確保它顯示出來),但它似乎沒有對參考文獻做任何事情,這感覺就像是正確的方向,但是上面提出的目標仍然存在。 – 2009-11-05 22:49:47

+0

嘗試在改變它們之前和之後打印參考文獻,在打造目標本身之前打印如下: 「ref:%(Re ference.Identity):%(Reference.Private)「 – radical 2009-11-06 06:17:39

+0

我能夠讓這種方法最終適用於參考文獻(我在過濾器文件中有其他錯誤),但我認爲上面的Sayed的解決方案更清晰。 – 2009-11-06 17:19:03