web-dev-qa-db-fra.com

La cible de génération personnalisée Delphi XE est toujours désactivée

J'ai créé un MSBuild personnalisé .targets fichier que j'ai inclus dans un projet Delphi XE via le IDE et activé dans le menu contextuel du gestionnaire de projet. Bien que le fichier soit valide, il est toujours désactivé après avoir réenregistré le fichier de projet.

Voici une version simplifiée du fichier 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: saisie ...

MSBuild Custom.target /t:Hello

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

Ajouter Custom.targets vers un projet Delphi via le IDE affiche le fichier dans le gestionnaire de projet comme prévu, et le .dproj le fichier contient maintenant la ligne ...

<TargetsFile Include="Custom.targets"/>

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

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

Un nouveau clic droit dans le Gestionnaire de projets affiche toujours l'option Enable au lieu de la Disable attendue.

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

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

<Import Project="Custom.targets"/>

Taper MSBuild ProjectName.dproj /t:Hello fonctionne maintenant. Mais la prochaine fois que j'enregistre le fichier de projet depuis le IDE le <Import> l'instruction est supprimée.

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

177
delphidabbler

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

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

Compilez-le ensuite avec:

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

Cette approche vous permet de personnaliser les cibles de génération pour vous assurer que chaque application obtient les paramètres corrects sans être affectée par les modifications apportées par quiconque.

1
Fran

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

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

Sauf si vous avez du code source ou si vous êtes prêt à patcher le singe, vous ne pouvez pas le faire.

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

1
Warren P