Das benutzerdefinierte Delphi XE-Build-Ziel ist immer deaktiviert

177

Ich habe eine benutzerdefinierte MSBuild- .targetsDatei erstellt, die ich über die IDE in ein Delphi XE-Projekt aufgenommen und über das Kontextmenü des Projektmanagers aktiviert habe. Obwohl die Datei validiert wird, wird sie immer deaktiviert, nachdem ich die Projektdatei erneut gespeichert habe.

Hier ist eine vereinfachte Version der Zieldatei mit dem Namen Custom.targets.

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

Als eigenständige Datei funktioniert dies wie erwartet: Tippen ...

MSBuild Custom.target /t:Hello

... in der Befehlszeile gibt die erwartete Nachricht.

Beim Hinzufügen Custom.targetszu einem Delphi-Projekt über die IDE wird die Datei wie erwartet im Projektmanager angezeigt, und die .dprojDatei enthält jetzt die Zeile ...

<TargetsFile Include="Custom.targets"/>

Ich habe mit der rechten Maustaste auf die Datei im Projektmanager der IDE geklickt und ausgewählt Enable. Wenn das Projekt erstellt wird, wird das folgende BuildMeldungsfenster angezeigt:

[MSBuild-Warnung] Custom.targets (1): Deaktivierten Import ignorieren: PathToProjectSource\\Custom.targets

Wenn Sie im Projektmanager erneut mit der rechten Maustaste klicken, wird weiterhin die EnableOption anstelle der erwarteten angezeigt Disable.

An der Kommandozeile MSBuild ProjectName.dproj /t:Helloschlägt ebenfalls fehl.

Ich habe versucht, die .dprojDatei zu hacken , um die Zeile hinzuzufügen ...

<Import Project="Custom.targets"/>

Das Tippen MSBuild ProjectName.dproj /t:Hellofunktioniert jetzt. Aber wenn ich das nächste Mal die Projektdatei aus der IDE speichere, wird die <Import>Anweisung entfernt.

Hat jemand eine Idee, was bitte falsch läuft?

Delphidabbler
quelle
10
In Ihrem Beispiel für die Verwendung von msbuild über die Befehlszeile wird Custom.target angezeigt, während Sie überall Custom.targets verwenden . Welches ist es?
Kenneth Cochran
4
Guter Ort - das hatte ich nicht bemerkt, obwohl ich viel auf den Code gestarrt hatte. Ich kann einige Tage lang (im Krankenhaus!) Nicht an eine Maschine mit Delphi gelangen, werde aber den Code mit "Ziel" oder "Zielen" konsistent versuchen, wenn ich kann.
Delphidabbler
6
Kein Delphi Benutzer, sondern nach der dies Alle .targets Dateien müssen gültige MSBuild Scripts enthalten Fehler frei von. Wenn die Datei Fehler enthält, werden Sie benachrichtigt. Wenn das Projekt auf die ungültige .targets-Datei verweist, ist sie deaktiviert und kann erst wieder aktiviert werden, wenn die Fehler behoben sind. Es könnte sich lohnen, noch einmal zu überprüfen, ob alles korrekt ist, da dies die Symptome erklärt, die Sie bekommen.
Daniel Morritt
Leider kann ich in XE7 Ihr Problem nicht reproduzieren, alles scheint wie erwartet zu funktionieren: Erstellen von der Eingabeaufforderung mit /t:Hellosowie von der IDE mit Rechtsklick im Projektmanager - Ziele - Hallo. Ich habe Custom.targetsdem Projekt hinzugefügt , indem ich mit der rechten Maustaste in den Projektmanager - Hinzufügen - geklickt habe (nach der Datei gesucht). Der Pfad ist dasselbe Verzeichnis wie die .dproj-Datei.
Ondrej Kelle

Antworten:

1

Delphi generiert den gesamten dproj-Inhalt selbst und dieser benutzerdefinierte Import wird immer gelöscht.

Sie könnten Ihre eigenen msbuild-XML-Dateien schreiben, aber das dproj gehört zu Delphi.

Wenn Sie keinen Quellcode haben oder bereit sind, die Idee zu patchen, können Sie das nicht tun.

Wenn Sie wirklich eine flexible XML-Methode zum Erstellen von Delphi-Projekten und zum Erstellen von Zielen in Hülle und Fülle wünschen, versuchen Sie, vnext zu wollen oder zu wollen (meine Gabel auf bitbucket).

Warren P.
quelle
1

Ich würde die Zieldatei manuell einschließen und extern mit MSBuild anstatt aus der IDE erstellen, da es beim Kompilieren aus der IDE etwas unübersichtlich ist, zu wissen, welche Konfiguration und welches Ziel Sie angewendet haben (ist diejenige, auf die das Projekt geklickt hat? Oder die von aktiviertes Ziel? Sie erhalten keinen visuellen Hinweis darauf, dass ein benutzerdefiniertes Ziel aktiviert ist.

Normalerweise mache ich das vor dem, Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"damit sie nicht in der IDE angezeigt werden (sie existieren, sind aber für Entwickler verborgen).

Zum Beispiel enden meine Delphi XE4-Projekte mit:

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

Meine .targets-Datei definiert eine benutzerdefinierte "PropertyGroup" und "Target" mit einer Bedingung, sodass sie nur gelten, wenn sie von MSBuild aufgerufen werden:

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

Dann kompilieren Sie es mit:

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

Mit diesem Ansatz können Sie Build-Ziele anpassen, um sicherzustellen, dass jede Anwendung die richtigen Einstellungen erhält, ohne von Änderungen betroffen zu sein.

Fran
quelle