Пользовательская цель Delphi XE всегда отключена

Я создал собственный Custom.targetsфайл MS.targets, который я включил в проект Delphi XE через IDE и <Project xmlns = "http://schemas.microsoft.com/developer/msbuild/2003" > <Target Name = «Привет» > < Текст сообщения = «Привет из настраиваемой цели» /> </ Target> </ Project> d из контекстного меню Project Manager. Хотя файл проверяется, он всегда получает MSBuild Custom . target / t : Hello d после перезапуска файла проекта.

Вот упрощенная версия файла целей, названная Custom.targets.

.dproj

В качестве самостоятельного файла это работает так, как ожидалось: набрав ...

<TargetsFile Include="Custom.targets"/>

... в командной строке дается ожидаемое сообщение.

Добавление Enableв проект Delphi через IDE отображает файл в диспетчере проектов, как ожидается, и Buildтеперь файл содержит строку ...

PathToProjectSource\Custom.targets

Я щелкнул правой кнопкой мыши файл в диспетчере проектов IDE и был выбран Enable. Но когда проект будет построен, Buildпоявится окно сообщения:

[MSBuild Warning] Custom.targets (1): игнорирование отключенного импорта: Disable

При повторном щелчке правой кнопкой мыши в диспетчере проектов отображается Enableопция вместо ожидаемого Disable.

В командной строке MSBuild ProjectName.dproj /t:Helloтакже терпит неудачу.

Я попытался взломать .dprojфайл, чтобы добавить строку ...

<Import Project="Custom.targets"/>

MSBuild ProjectName.dproj /t:HelloСейчас печатает . Но в следующий раз, когда я сохраню файл проекта из IDE, <Import>оператор будет удален.

Кто-нибудь понял, что происходит неправильно?

delphi,msbuild,delphi-xe,

175

Ответов: 2


1

Delphi генерирует весь контент dproj, и этот пользовательский импорт всегда будет удален.

Вы можете написать свои собственные файлы msbuild xml, но dproj принадлежит Delphi.

Если у вас нет исходного кода или вы хотите обезьянную патч, вы не можете это сделать.

Если вам действительно нужен гибкий способ xml для создания проектов delphi и создания целей в изобилии, попробуйте хотите или хотите vnext (моя вилка на битбакете)


0

Я бы включил файл целей вручную и создавал извне с помощью MSBuild, а не из среды IDE, потому что, когда компиляция из IDE была немного беспорядочной, чтобы узнать, какая конфигурация и цель были вами применены (это тот, который нажал на проект? Или один из включенная цель? вы не получаете визуального намека на то, что настраиваемая цель включена).

Обычно я делаю это до того, Import Project="$(BDS)BinCodeGear.Delphi.Targets"чтобы они не показывались на IDE (они существуют, но скрыты для разработчиков).

Например, мои проекты Delphi XE4 заканчиваются:

    <Import Project="..BuildServer.Targets"/>
    <Import Project="$(BDS)BinCodeGear.Delphi.Targets" Condition="Exists('$(BDS)BinCodeGear.Delphi.Targets')"/>
    <Import Project="$(APPDATA)Embarcadero$(BDSAPPDATABASEDIR)$(PRODUCTVERSION)UserTools.proj" Condition="Exists('$(APPDATA)Embarcadero$(BDSAPPDATABASEDIR)$(PRODUCTVERSION)UserTools.proj')"/>
</Project>

Мой файл .targets определяет пользовательские «PropertyGroup» и «Target» с условием, поэтому они будут применяться только при вызове из MSBuild:

  <PropertyGroup  Condition="'$(Config)'=='CustomConfig'">
    <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
    ...
  </PropertyGroup>
  <Target Name="DisplayProjectInfo">
    <Message Text="Project File Name = $(MSBuildProjectFile)"/>
    <Message Text="Version = $(VerInfo_Keys)"/>
    <Message Text="OutputDir = $(DCC_ExeOutput)"/>
  </Target>
  <Target Name="CustomTarget" Condition="'$(Config)'=='CustomConfig'">
  <MSBuild Projects="$(MSBuildProjectFile)" Targets="Clean" />
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" />
    <CallTarget Targets="DisplayProjectInfo"/>
  </Target>

Затем скомпилируйте его с помощью:

msbuild /t:CustomTarget /p:config=CustomConfig poject.dproj

Используя этот подход, вы можете настроить цели сборки, чтобы убедиться, что каждое приложение получает правильные настройки, не подвергая изменениям, внесенным кем-либо.

delphi, msbuild, delphi-xe,
Похожие вопросы