2011-07-26 2 views
0

私は、ゲーム実行可能ファイルによって使用される "エンジン"ライブラリを持っています。そのエンジンライブラリはエディタ実行可能ファイルによっても使用されます。Msbuildプリプロセッサは、メインEXEプロジェクトのすべての依存関係を定義します。

editor.exeのために構築されたプリプロセッサー定数EDITORでエンジンlibをビルドしたい エンジン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トリッキーが少し必要です。参照されるプロジェクトの構築方法は、@(ProjectReferenceWithConfiguration)アイテム配列に、Microsoft.Common.targetsファイルの操作を使用することです。プロジェクトがこのようにこのアイテム配列に含まれていて、あるプロジェクトでは他のプロジェクトではない場合、

<!-- 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の内側に、あなたはそれに基づいて欲しいものは何でも修正することができます親pr ojectは参照を持っています。

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

cool、私はそれが動作することがわかります。ちょっと思ったことです:参照されているプロジェクトが、参照しているプロジェクトのDefineConstantsプロパティを "継承"することはできますか? –

+0

この種の継承のようなものは本当にありません。参照プロジェクトがビルドされると、MSBuildタスクと他のすべての参照プロジェクトとともに明示的にビルドされます。 AdditionalPropertiesメタデータには、余分な構成情報をプロジェクトに個別に渡すオプションがあります。 –

+0

私はより洗練されたソリューションを望んでいましたが、そうではないようです。あなたの返信に感謝:) –

関連する問題