177 votes

La cible de construction personnalisée de Delphi XE est toujours désactivée.

J'ai créé un MSBuild personnalisé. .targets que j'ai inclus dans un projet Delphi XE via l'IDE et que j'ai activé à partir du menu contextuel du gestionnaire de projet. Bien que le fichier soit validé, il est toujours désactivé lorsque je réenregistre le fichier du projet.

Voici une version simplifiée du fichier des cibles, nommée Custom.targets .

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

En tant que fichier autonome, cela fonctionne comme prévu : taper...

MSBuild Custom.target /t:Hello

...à la ligne de commande donne le message attendu.

Ajout de Custom.targets à un projet Delphi via l'IDE affiche le fichier dans le gestionnaire de projet comme prévu, et la commande .dproj contient maintenant la ligne...

<TargetsFile Include="Custom.targets"/>

J'ai fait un clic droit sur le fichier dans le gestionnaire de projet de l'IDE et j'ai sélectionné Enable . Mais lorsque le projet est construit, le Build La fenêtre de message s'affiche :

[Avertissement MSBuild] Custom.targets(1) : Ignorer l'importation désactivée : PathToProjectSource\\Custom.targets

En cliquant à nouveau avec le bouton droit de la souris dans le gestionnaire de projet, on obtient toujours l'écran suivant Enable au lieu de l'option attendue Disable .

À la ligne de commande MSBuild ProjectName.dproj /t:Hello échoue également.

J'ai essayé de pirater le .dproj pour ajouter la ligne...

<Import Project="Custom.targets"/>

Dactylographie MSBuild ProjectName.dproj /t:Hello fonctionne maintenant. Mais la prochaine fois que je sauvegarderai le fichier du projet à partir de l'IDE, l'écran de l'IDE ne fonctionnera pas. <Import> est supprimée.

Quelqu'un a une idée de ce qui ne va pas ?

2voto

Warren P Points 23750

Delphi génère lui-même l'intégralité du contenu du dproj et cette importation personnalisée sera toujours supprimée.

Vous pouvez écrire vos propres fichiers xml msbuild mais le dproj appartient à Delphi.

À moins que vous n'ayez le code source ou que vous soyez prêt à modifier l'idéal, vous ne pouvez pas le faire.

Si vous voulez vraiment un moyen xml flexible pour construire des projets delphi et créer des cibles à profusion, essayez want ou want vnext (mon fork sur bitbucket).

2voto

Fran Points 63

J'inclurais le fichier des cibles manuellement et je construirais en externe en utilisant MSBuild plutôt qu'à partir de l'IDE, car lors de la compilation à partir de l'IDE, il est un peu difficile de savoir quelle configuration et quelle cible vous avez appliquées (est-ce celle qui est cliquée sur le projet ? ou celle de la cible activée ? vous n'avez aucune indication visuelle qu'une cible personnalisée est activée).

Je le fais habituellement avant le Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" afin qu'ils n'apparaissent pas dans l'IDE (ils existent, mais sont cachés aux développeurs).

Par exemple, mes projets Delphi XE4 se terminent par :

    <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>

Mon fichier .targets définit un "PropertyGroup" et une "Target" personnalisés avec une condition, de sorte qu'ils ne s'appliquent que lorsqu'ils sont appelés par 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>

Puis compilez-le avec :

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

Cette approche vous permet de personnaliser les cibles de construction pour vous assurer que chaque application reçoit les paramètres corrects sans être affectée par les modifications apportées par quiconque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X