Msbuild препроцессор определить для всех зависимостей основного EXE-проекта - PullRequest
0 голосов
/ 26 июля 2011

У меня есть библиотека "engine", которая используется исполняемым файлом игры.Эта библиотека движка также используется исполняемым файлом редактора.

Я хочу собрать lib движка с константой препроцессора 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 Ответ

1 голос
/ 26 июля 2011

Это возможно , но требует немного хитрости 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, изменитьвсе, что вы хотите на основе ссылки на родительский проект,

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