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

177

J'ai créé un .targetsfichier MSBuild personnalisé que j'ai inclus dans un projet Delphi XE via l'EDI et l'ai activé à partir du menu contextuel du gestionnaire de projet. Bien que le fichier soit validé, il est toujours désactivé après la réenregistrement du fichier de projet.

Voici une version simplifiée du fichier de cibles, nommé 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.

L'ajout Custom.targetsà un projet Delphi via l'EDI affiche le fichier dans le gestionnaire de projet comme prévu, et le .dprojfichier contient maintenant la ligne ...

<TargetsFile Include="Custom.targets"/>

J'ai cliqué avec le bouton droit sur le fichier dans le gestionnaire de projet de l'EDI et sélectionné Enable. Mais lorsque le projet est construit, la Buildfenêtre de message s'affiche:

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

Un nouveau clic droit dans Project Manager affiche toujours l' Enableoption au lieu de l'attente Disable.

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

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

<Import Project="Custom.targets"/>

La saisie MSBuild ProjectName.dproj /t:Hellofonctionne maintenant. Mais la prochaine fois que j'enregistre le fichier de projet à partir de l'EDI, l' <Import>instruction est supprimée.

Quelqu'un a une idée de ce qui ne va pas s'il vous plaît?

delphidabbler
la source
10
Dans votre exemple d'utilisation de msbuild à partir de la ligne de commande, vous affichez Custom.target alors que partout ailleurs vous utilisez Custom.targets . Lequel est-ce?
Kenneth Cochran
4
Bon endroit - je n'avais pas remarqué cela malgré beaucoup de regard sur le code. Je ne peux pas accéder à une machine avec Delphi dessus pendant quelques jours (à l'hôpital!), Mais j'essaierai le code en utilisant "cible" ou "cibles" de manière cohérente quand je le pourrai.
delphidabbler
6
Pas un utilisateur Delphi, mais selon cela Tous les fichiers .targets doivent contenir des scripts MSBuild valides sans erreur. Si le fichier contient des erreurs, vous en êtes informé et, si le projet fait référence au fichier .targets non valide, il est désactivé et ne peut pas être réactivé tant que les erreurs ne sont pas corrigées. Cela pourrait valoir la peine de vérifier que tout est correct, car cela explique les symptômes que vous ressentez.
Daniel Morritt
Malheureusement dans XE7 je ne peux pas reproduire votre problème, tout semble fonctionner comme prévu: construire à partir de l'invite de ligne de commande avec /t:Helloainsi que depuis l'EDI avec un clic droit dans le Gestionnaire de projet - Cibles - Bonjour. J'ai ajouté Custom.targetsau projet en cliquant avec le bouton droit dans le gestionnaire de projet - Ajouter - (parcouru pour le fichier). Le chemin est le même répertoire que le fichier .dproj.
Ondrej Kelle

Réponses:

1

Delphi génère lui-même tout le contenu 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'ide, vous ne pouvez pas le faire.

Si vous voulez vraiment un moyen xml flexible de créer des projets Delphi et de créer des cibles à gogo, essayez de vouloir ou de vouloir vnext (mon fork sur bitbucket)

Warren P
la source
1

J'inclurais le fichier de cibles manuellement et je construirais en externe à l'aide de MSBuild plutôt qu'à partir de l'EDI, car lors de la compilation à partir de l'EDI, il est un peu compliqué de savoir quelle configuration et quelle cible vous avez appliquées (celle sur laquelle vous avez cliqué est-elle celle sur laquelle vous avez cliqué? Ou celle de cible activée? vous n'obtenez aucun indice visuel indiquant qu'une cible personnalisée est activée).

Je le fais généralement avant le Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"afin qu'ils ne s'affichent pas sur l'EDI (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 un "Target" personnalisés avec une condition, donc ils ne s'appliqueront que lorsqu'ils seront appelés depuis 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

L'utilisation de cette approche vous permet de personnaliser les cibles de construction pour vous assurer que chaque application obtient les paramètres corrects sans être affectée par les modifications apportées par quiconque.

Fran
la source