1

我有以下情形:的Visual Studio 2012的「條件」的項目設置

  • 兩個Visual Studio的C++解決方案 - 一個是內部使用,一個應該是 運到客戶端的示例代碼。這兩種解決方案配置的數量和項目提供

  • 兩個解決方案有一個共同的項目,我需要自定義取決於包括它

  • 我需要定製的解決方案位的數量不同根據母公司的解決方案是:

    • 項目配置的可用數量 - 我有4個配置爲內部解決,只有2附帶的客戶一個
    • 一些後構建命令
    • 一些包含路徑
    • 一個定義是特定的僅適用於附帶的客戶端解決方案
  • 我想避免的是創造和維護髮運客戶一個單獨的項目文件的項目解決方案

我試圖玩屬性表,但我認爲這解決了與我的不同的問題,主要是爲了共享不同項目之間的配置。我還在尋找如何在項目屬性文件中使用條件屬性來查看是否可以幫助我(仍在調查)。

編輯:我不能使用任何項目生成工具,比如CMake的,premake等

有沒有在Visual Studio中的任何方式來實現我需要什麼?關於如何改進我迄今爲止的設置的任何建議 - 也許可以避免這兩種解決方案的情況?

+0

您是否已經研究過有條件地導入子項目文件(MSBuild處理這種東西的方式)? – Filburt

+0

@Filburt我會怎麼做?我試過尋找關於子項目的文檔,但是我找不到很多 - 是某種隱藏功能(我來自一個Makefile世界,所以我缺乏通用性,當涉及到VS和MSBuild時) – celavek

回答

2

由於Visual Studio項目由MSBuild處理,因此可以根據您的需求進行自定義。

導入自定義目標項目文件到您現有的.vcxproj可能是這個樣子:

 <!-- 
     ... 
     way to the end of your .vcxproj file 

     --> 

     <!-- start of custom import part --> 

     <Import Project=".\YourInternal.targets" Condition="Exists('.\YourInternal.targets')" /> 

     <!-- end of custom import part --> 

     <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 
     <ImportGroup Label="ExtensionTargets"> 
    </ImportGroup> 
</Project> 

你.vcxproj將只包含的項目/配置的子集,你希望提供給客戶/命令 - 與您的內部構建過程相關的所有內容都將包含在一個或多個.targets項目文件中,該文件將被簡單地從您的客戶中刪除。

例如,如果你有一個內部的Custom Build Step \ Execute Before \ Clean,你會從你的。vcxproj文件,並將其添加到您的YourInternal.targets項目文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> 
     <CustomBuildBeforeTargets>Clean</CustomBuildBeforeTargets> 
    </PropertyGroup> 
</Project> 

如果你有需要延長內部處理項目的集合,你可以在你的.targets其他項目串連基本設置你的.vcxproj的文件(S):

.vcxproj

... 
<ItemGroup> 
    <ClInclude Include="Header.h" /> 
</ItemGroup> 
... 

.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <!-- includes to items definded in your .vcxproj --> 
     <ClInclude Include="@(ClInclude)" /> 

     <!-- add more items here --> 
     <ClInclude Include="Foo.h" /> 
     <ClInclude Include="Bar.h" /> 
    </ItemGroup> 
</Project> 

這個例子只是通過MSBuild命令擴展你的.vcxproj來實現你可以實現的目標。

+1

謝謝你指點我正確的方向。雖然它有效,但它有兩個主要缺點:1. ** IDE不知道它(這是多麼愚蠢?),所以如果我通過IDE中的管理器修改某些屬性,那麼它會被寫入原始文件 - 有點的噩夢**。 2. **沒有簡單的方法來覆蓋一個屬性; .targets文件中的優先級最低,所以我必須執行一些基於條件的技巧**。總而言之,我現在並不確信該方法實際上比具有兩個不同的項目文件更好。 – celavek

+1

我的例子只是擴展/覆蓋的一種可能的方式 - 如果您將自定義.targets包含在.vcxproj的頂部,則可以以相反方式對行爲進行建模並使.vcxproj處於優先地位。當然,沒有直接的方法可以通過IDE編輯。我正在處理.csproj,不得不承認.vcxproj在很多方面都有所不同。在每一次構建之前,至少MSBuild會爲您提供任何時髦的Xml工具鏈 - 在您的.vcxproj中擺弄。 – Filburt

0

您可以使用項目生成工具,如premake。它使用LUA生成解決方案和項目,因此您可以根據父解決方案明確定製項目設置。

+0

不幸的是我不能使用那個或任何其他這樣的工具。 – celavek

0

您可以使用一些XSLT處理來清理內部項目以及要發送給客戶端的單獨解決方案文件。

+0

你能舉個例子嗎? – celavek

+0

這不是一個標準的解決方案,需要某種工具來實際處理。這是我剛剛提出的,因爲最終項目文件只是普通的XML文檔。 – riezebosch