Спеціальна ціль збірки Delphi XE завжди вимикається


177

Я створив користувальницький .targetsфайл MSBuild, який я включив у проект Delphi XE через IDE і включив його в контекстне меню менеджера проектів. Хоча файл перевіряється, він завжди вимикається після того, як я повторно збережу файл проекту.

Ось спрощена версія файлу цільових назв Custom.targets.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Hello">
    <Message Text="Hello from custom target"/>
  </Target>
</Project>

Як окремий файл, це працює як слід: вводячи ...

MSBuild Custom.target /t:Hello

... у командному рядку видає очікуване повідомлення.

Додавання Custom.targetsдо проекту Delphi через IDE відображає файл у диспетчері проектів як очікувалося, а .dprojфайл тепер містить рядок ...

<TargetsFile Include="Custom.targets"/>

Я клацнув правою кнопкою миші файл у менеджері проектів IDE і вибрав Enable. Але коли проект побудований, Buildвідображається вікно повідомлень:

[Попередження MSBuild] Custom.targets (1): Ігнорування відключеного імпорту: PathToProjectSource\\Custom.targets

Клацання правою кнопкою миші знову в диспетчері проектів все ще показує Enableпараметр замість очікуваного Disable.

У командному рядку MSBuild ProjectName.dproj /t:Helloтакож виходить з ладу.

Я намагався зламати .dprojфайл, щоб додати рядок ...

<Import Project="Custom.targets"/>

Введення тексту MSBuild ProjectName.dproj /t:Helloзараз працює. Але наступного разу, коли я зберігаю файл проекту з IDE, <Import>виписка видаляється.

Хтось має ідею, що піде не так?


10
У вашому прикладі використання msbuild з командного рядка ви показуєте Custom.target, тоді як скрізь ви використовуєте Custom.targets . Що це таке?
Кеннет Кокран

4
Гарне місце - я не помічав цього, незважаючи на те, що сильно дивився на код. Я не можу потрапити до машини з Delphi на ній протягом декількох днів (у лікарні!), Але спробую код, використовуючи "target" або "target" послідовно, коли зможу.
дельфідаблер

6
Не користувач Delphi, але відповідно до цього всі файли .targets повинні містити дійсні сценарії MSBuild без помилок. Якщо у файлі є помилки, ви отримуєте сповіщення, і якщо проект посилається на недійсний файл .targets, він вимикається і не може бути повторно включений, поки помилки не будуть виправлені. Можливо, варто подвійно перевірити, чи все правильно, оскільки це пояснює симптоми, які ви отримуєте.
Даніель Моррітт

На жаль, в XE7 я не можу відтворити вашу проблему, все, здається, працює так, як очікувалося: побудова з командного рядка підказки з /t:Hello, а також з IDE, клацнувши правою кнопкою миші в диспетчері проектів - Цілі - Привіт. Я додав Custom.targetsдо проекту, клацнувши правою кнопкою миші в Менеджері проектів - Додати - (переглянув файл). Шлях - той самий каталог, що і файл .dproj.
Ондрей Келле

Відповіді:


1

Delphi генерує весь вміст dproj сам, і цей спеціальний імпорт завжди буде видалений.

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

Якщо у вас немає вихідного коду або ви не готові мавпа виправити ідею, ви не можете це зробити.

Якщо ви дійсно хочете, щоб гнучкий xml спосіб створював проекти delphi та створював цілі, не вистачаючи спробуйте, хочете або хочете vnext (мій вилок на bitbucket)


1

Я включав би цільовий файл вручну та створював зовнішньо, використовуючи MSBuild, а не з IDE, тому що при компілюванні з IDE його дещо заплутано, щоб знати, яку конфігурацію та ціль ви застосували (чи той, хто натиснув на проект? Чи той із включена ціль? Ви не отримуєте жодного візуального натяку на те, що спеціальна ціль увімкнена).

Я зазвичай роблю це раніше, Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"щоб вони не відображалися в IDE (вони існують, але приховані для розробників).

Наприклад, мої проекти Delphi XE4 закінчуються на:

    <Import Project="..\BuildServer.Targets"/>
    <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.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

Використовуючи цей підхід, ви можете налаштувати цілі побудови, щоб переконатися, що кожна програма отримує правильні налаштування, не впливаючи на зміни, внесені кимось.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.