2011-07-26 16 views
0

我有一個遊戲可執行文件使用的「引擎」庫。該引擎庫也被編輯器可執行文件使用。Msbuild預處理器爲主要exe項目的所有依賴項定義

我想用一個預處理器常量EDITOR爲editor.exe構建引擎庫 當引擎lib爲遊戲而構建時,沒有「EDITOR」預處理器常量。

有沒有辦法說引用項目中的預處理器常量應該用於依賴構建?

我在編輯器中.csproj嘗試這樣做:

<Project ToolsVersion="4.0" DefaultTargets="Build"> 
    <PropertyGroup> 
    <AssemblyName>MyEditor</AssemblyName> 
    <DefineConstants>EDITOR</DefineConstants> 
    ... 

,但只適用於MyEditor.exe組裝。我希望它也適用於所有參考。

我希望這是不夠清楚:)

編輯:我可以在命令行這方面的工作與msbuild MyEditor.csproj /p:DefineConstants=EDITOR,但我不知道如何在Visual Studio中相同的效果

回答

1

這是可能,但需要一點MSBuild欺騙。引用的項目構建方式是,它們通過Microsoft.Common.targets文件中的操作最終放入@(ProjectReferenceWithConfiguration)項目數組中。現在,如果該項目被列入本項數組像這樣,在一個項目,但不能從其他

<!-- pseudo-code for what Microsoft.Common.targets creates --> 
<ItemGroup> 
    <ProjectReferenceWithConfiguration Include="ReferencedProject.csproj"> 
     <AdditionalProperties>DefineConstants=EDITOR</AdditionalProperties> 
    </ProjectReferenceWithConfiguration> 
</ItemGroup> 

...這將獲得建立你想要的方式。你怎麼設置它呢?那麼,你可以用你自己的自定義目標創建@(ProjectReferenceWithConfiguration)項目數組,並添加AdditionalProperties元數據值。事情是這樣的......

<!-- inside referencing project --> 
<Target Name="AddEditorConstant" 
    AfterTargets="AssignProjectConfiguration" 
    BeforeTargets="_SplitProjectReferencesByFileExistence"> 
    <ItemGroup> 
     <ProjectReferenceWithConfiguration 
     Condition="'%(Identity)' == 'ReferencedProject.csproj'> 
     <AdditionalProperties>DefineConstants=EDITOR</AdditionalProperties> 
     </ProjectReferenceWithConfiguration> 
    </ItemGroup> 
</Target> 

(請注意,我並沒有真正運行這個,有些實驗可能需要)

對於反轉定製的位置更通用的解決方案,把它放在裏面參考項目,而不是引用裏面,你可以改爲與基準爲自定義屬性到所有引用注入父項目,

<!-- somewhere common to all projects --> 
<Target Name="InjectReferencingProject" 
    AfterTargets="AssignProjectConfiguration" 
    BeforeTargets="_SplitProjectReferencesByFileExistence"> 
    <ItemGroup> 
     <ProjectReferenceWithConfiguration> 
     <AdditionalProperties>ReferencingProject=$(MSBuildProjectFile)</AdditionalProperties> 
     </ProjectReferenceWithConfiguration> 
    </ItemGroup> 
</Target> 

,然後在裏面ReferencedProject.csproj,修改此基礎上任何你想要的父母公關oject具有參考,

<!-- inside referenced project --> 
<PropertyGroup> 
    <DefineConstants>default-constants</DefineConstants> 
    <DefineConstants 
     Condition="'$(ReferencingProject)' == 'SomeSpecialProject.csproj'" 
     >$(DefineConstants);EDITOR</DefineConstants> 
</PropertyGroup> 
+0

很酷,我可以看到,可以工作。只是一個想法:引用的項目能否「繼承」引用項目的DefineConstants屬性? –

+0

真的沒有這種繼承的東西。當引用的項目被構建時,它將與MSBuild任務以及所有其他引用的項目一起顯式構建。 AdditionalProperties元數據提供了一個選項,可以將額外的配置信息分別傳遞到項目中。 –

+0

我希望有一個更優雅的解決方案,但似乎沒有一個。所以謝謝你的回覆:) –

相關問題