La destinazione di creazione personalizzata di Delphi XE è sempre disabilitata


177

Ho creato un .targetsfile MSBuild personalizzato che ho incluso in un progetto Delphi XE tramite l'IDE e l'ho abilitato dal menu di scelta rapida del Project Manager. Sebbene il file venga convalidato, viene sempre disabilitato dopo il salvataggio del file di progetto.

Ecco una versione semplificata del file target, denominata Custom.targets.

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

Come file autonomo funziona come previsto: digitando ...

MSBuild Custom.target /t:Hello

... dalla riga di comando fornisce il messaggio previsto.

L'aggiunta Custom.targetsa un progetto Delphi tramite l'IDE visualizza il file nel Project Manager come previsto, e il .dprojfile ora contiene la riga ...

<TargetsFile Include="Custom.targets"/>

Ho fatto clic con il pulsante destro del mouse sul file nel Project Manager dell'IDE e ho selezionato Enable. Ma quando il progetto viene creato, viene Buildvisualizzata la finestra del messaggio:

[MSBuild Warning] Custom.targets (1): Ignorare l'importazione disabilitata: PathToProjectSource\\Custom.targets

Facendo nuovamente clic con il pulsante destro del mouse in Project Manager, viene comunque visualizzata l' Enableopzione anziché quella prevista Disable.

Anche alla riga di comando MSBuild ProjectName.dproj /t:Hellofallisce.

Ho provato a hackerare il .dprojfile per aggiungere la linea ...

<Import Project="Custom.targets"/>

La digitazione MSBuild ProjectName.dproj /t:Helloora funziona. Ma la prossima volta che salverò il file di progetto dall'IDE l' <Import>istruzione viene rimossa.

Qualcuno ha idea di cosa non va, per favore?


10
Nel tuo esempio di utilizzo di msbuild dalla riga di comando mostri Custom.target mentre ovunque usi Custom.targets . Cos'è questo?
Kenneth Cochran,

4
Buon posto - non me ne ero accorto nonostante fissassi molto il codice. Non riesco ad arrivare a una macchina con Delphi per alcuni giorni (in ospedale!), Ma proverò il codice usando "target" o "target" in modo coerente quando posso.
delphidabbler

6
Non un utente Delphi, ma secondo questo Tutti i file .targets devono contenere script MSBuild validi privi di errori. Se il file presenta errori, si riceve una notifica e, se il progetto fa riferimento al file .targets non valido, viene disabilitato e non può essere riattivato fino a quando gli errori non vengono corretti. Potrebbe valere la pena ricontrollare che tutto sia corretto poiché ciò spiega i sintomi che stai riscontrando.
Daniel Morritt,

Sfortunatamente in XE7 non riesco a riprodurre il tuo problema, tutto sembra funzionare come previsto: compilando dal prompt della riga di comando /t:Helloe dall'IDE con il tasto destro del mouse in Project Manager - Target - Hello. Ho aggiunto Custom.targetsal progetto facendo clic con il tasto destro nel Project Manager - Aggiungi - (ha cercato il file). Il percorso è la stessa directory del file .dproj.
Ondrej Kelle,

Risposte:


1

Delphi genera l'intero contenuto di dproj e questa importazione personalizzata verrà sempre eliminata.

Potresti scrivere i tuoi file xml msbuild ma dproj appartiene a Delphi.

A meno che tu non abbia il codice sorgente o sia disposto a scimmiottare l'ide non puoi farlo.

Se vuoi davvero un modo xml flessibile per costruire progetti delphi e creare obiettivi in ​​abbondanza, prova a voler o volere vnext (il mio fork su bitbucket)


1

Includerei manualmente il file target e lo costruissi esternamente usando MSBuild piuttosto che dall'IDE, perché durante la compilazione dall'IDE è un po 'complicato sapere quale configurazione e target sono stati applicati (quello su cui si fa clic sul progetto? O quello da target abilitato? non si ottiene alcun suggerimento visivo che un target personalizzato sia abilitato).

Di solito lo faccio prima, Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"quindi non verranno visualizzati sull'IDE (esistono, ma sono nascosti agli sviluppatori).

Ad esempio i miei progetti Delphi XE4 terminano con:

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

Il mio file .targets definisce un "PropertyGroup" personalizzato e "Target" con una condizione, quindi si applicheranno solo quando chiamato da 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>

Quindi compilalo con:

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

L'uso di questo approccio consente di personalizzare i target di creazione per assicurarsi che ogni applicazione ottenga le impostazioni corrette senza essere influenzata dalle modifiche apportate da chiunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.