2014-01-22 61 views
0

我有兩個項目和解決方案文件:MSBuild的進口和壓倒一切的文件

c:\dev\base\proja\proja.vbproj 
c:\dev\base\proja\myfile1.aspx 
c:\dev\base\proja\myfile1.aspx.vb 
c:\dev\base\proja\myfile1.aspx.vb.designer 
c:\dev\base\proja\myfile2.aspx 
c:\dev\base\proja\myfile2.aspx.vb 
c:\dev\base\proja\myfile2.aspx.vb.designer 

c:\dev\base\projb\mysln.sln 
c:\dev\base\projb\projb.vbproj 
c:\dev\base\projb\myfile2.aspx 
c:\dev\base\projb\myfile2.aspx.vb 
c:\dev\base\projb\myfile2.aspx.vb.designer 

proja.vbproj是基礎項目,而projb.vbproj旨在導入proja.vbproj和覆蓋myfile2.aspx etc文件。

proja.vbproj看起來是這樣的:

[...] 
<Compile Include="myfile1.aspx.vb"> 
    <SubType>ASPXCodebehind</SubType> 
    <DependentUpon>myfile1.aspx</DependentUpon> 
</Compile> 
<Compile Include="myfile2.aspx.vb"> 
    <SubType>ASPXCodebehind</SubType> 
    <DependentUpon>myfile2.aspx</DependentUpon> 
</Compile> 
[...] 
<Content Include="myfile1.aspx" /> 
<Content Include="myfile2.aspx" /> 
[...] 

projb.vbproj看起來是這樣的:

[...] 
<Import Project="$(ProjectDir)..\proja\proja.vbproj" /> 
[...] 
<Compile Include="myfile2.aspx.vb"> 
    <SubType>ASPXCodebehind</SubType> 
    <DependentUpon>myfile2.aspx</DependentUpon> 
</Compile> 
[...] 
<Content Include="myfile2.aspx" /> 
[...] 

projb.vbproj是一款專僅僅覆蓋的proja.vbproj自定義的文件 - 從中​​提供一個標準化的位置維護項目,同時允許針對每個站點定製的特定覆蓋。

當我在Visual Studio 2013中加載projb.vbproj並嘗試構建它時,問題就出現了。它會拋出大量錯誤,因爲它無法解析位於proja.vbproj中的myfile1.aspx和相關文件的位置。這似乎是因爲導入的路徑相對於projb.vbproj位置而不是proja.vbproj文件位置。

我試過預附加$(MSBuildProjectDirectory)的所有文件中proja.vbproj - 但我相信$(MSBuildProjectDirectory)是基於被打開,而不是導入項目上下文集,這並不解決問題。

我不想整個myproja.vbproj文件的內容複製到myprojb.vbproj只覆蓋一個文件 - 這似乎是混亂和對抗的MSBuild看似繼承爲中心的方法,但也許我錯了這裏...

有什麼辦法可以完成我之後的工作?那是;用一個項目的文件位置覆蓋某個項目的某些文件位置,而不必複製整個項目文件?

回答

1

這是你想重用你的項目,但你正在做的方式的部分好東西有幾個缺點(和他們只會變得更大,如果你的項目的發展):

  • 當你注意到它不能正常工作
  • 你很可能使用$(MsBuildThisFileDirectory)解決這個問題,但是這意味着只要你的Visual Studio將文件添加到你的項目,你必須應用修復再次
  • 項目b直接取決於項目a中的所有內容,這種緊密耦合永遠不是好跡象
  • 如果MsBuild看到Compile Include=aaa那麼會在編譯列表中加上 aaa。即使它已經在那裏。所以你不是在這裏重寫任何東西,你只是添加到項目中包含的文件a。不知道這是你想要的嗎?

你能做什麼,而不是:

  • 如果項目需要相同的構建設置(編譯/連接/ ...),添加這些設置到一個共同的,單獨的文件,包括在兩個項目
  • 如果項目需要共同的功能,只需將該功能放入項目中並在其他項目中引用該項目即可。因此,不要試圖用你的構建系統來重寫這些混亂的東西,而是提供一個公共基礎,然後向其中添加類。 (我對aspx/bb.net一無所知,但它肯定有創建'庫'類型項目的方法,您可以在其他人蔘考?)
  • 迴應您的評論:如果只有幾個文件是不同的,你也可以使用一個具有多個構建配置的單個項目。每個構建配置然後啓用不同的文件。所以通常你有像Debug和Release這樣的配置,現在你可以重新命名那些和額外的配置,比如ReleaseCustom1/ReleaseCustom2。

例如:

<!-- 500+ Common Files --> 
<Compile Include="myfile1.aspx.vb"/> 
<Compile Include="myfile2.aspx.vb"/> 
<!-- Some Specific Files --> 
<Compile Include="customfile1.aspx" Condition="'$(Configuration)'=='ReleaseCustom1'"/> 
<Compile Include="customfile2.aspx" Condition="'$(Configuration)'=='ReleaseCustom2'"/> 
+0

感謝您的答覆。實際上,我試過'$(MsBuildThisFileDirectory)',並且Visual Studio 2013在導入項目時仍然不能很好地播放。如果我在另一個項目中需要一個項目中的文件(我的項目之間的差異通常是針對500個文件「基礎」項目的一個或兩個文件) - 我應該創建導入正確文件而不是嘗試繼承的獨特項目這似乎不起作用)?最佳做法是什麼? – Yumbelie

+0

'最佳實踐'高度依賴於情況,但請參閱我的編輯:也許最後一個項目適合您。 – stijn

+0

這可能會奏效,非常感謝 – Yumbelie