Cel kompilacji niestandardowej Delphi XE jest zawsze wyłączony

177

Utworzyłem niestandardowy .targetsplik MSBuild , który umieściłem w projekcie Delphi XE za pośrednictwem IDE i włączyłem go z menu kontekstowego Project Manager. Chociaż plik jest weryfikowany, zawsze zostaje wyłączony po ponownym zapisaniu pliku projektu.

Oto uproszczona wersja pliku docelowego o nazwie Custom.targets.

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

Jako samodzielny plik działa to zgodnie z oczekiwaniami: wpisywanie ...

MSBuild Custom.target /t:Hello

... w wierszu poleceń wyświetla oczekiwany komunikat.

Dodanie Custom.targetsdo projektu Delphi za pośrednictwem IDE wyświetla plik w Menedżerze projektu zgodnie z oczekiwaniami, a .dprojplik zawiera teraz wiersz ...

<TargetsFile Include="Custom.targets"/>

Kliknąłem plik prawym przyciskiem myszy w menedżerze projektów IDE i wybrałem Enable. Ale kiedy projekt jest budowany, Buildokno komunikatu wyświetla:

[Ostrzeżenie programu MSBuild] Custom.targets (1): Ignorowanie wyłączonego importu: PathToProjectSource\\Custom.targets

Ponowne kliknięcie prawym przyciskiem myszy w Menedżerze projektów nadal pokazuje Enableopcję zamiast oczekiwanej Disable.

W linii poleceń MSBuild ProjectName.dproj /t:Hellorównież nie działa.

Próbowałem zhakować .dprojplik, aby dodać wiersz ...

<Import Project="Custom.targets"/>

MSBuild ProjectName.dproj /t:HelloTeraz pisanie działa. Ale następnym razem, gdy zapiszę plik projektu z IDE, <Import>instrukcja zostanie usunięta.

Czy ktoś ma pojęcie, co się dzieje, proszę?

delphidabbler
źródło
10
W Twoim przykładzie użycia msbuild z wiersza poleceń pokazujesz Custom.target, podczas gdy wszędzie indziej używasz Custom.targets . Który to jest?
Kenneth Cochran
4
Dobre miejsce - nie zauważyłem tego pomimo dużego wpatrywania się w kod. Nie mogę dostać się do maszyny z Delphi przez kilka dni (w szpitalu!), Ale spróbuję kod używając "target" lub "target" konsekwentnie kiedy tylko będę mógł.
delphidabbler
6
Nie jest użytkownikiem Delphi, ale zgodnie z tym wszystkie pliki .targets muszą zawierać prawidłowe skrypty MSBuild wolne od błędów. Jeśli plik zawiera jakiekolwiek błędy, zostaniesz o tym powiadomiony, a jeśli projekt odwołuje się do nieprawidłowego pliku .targets, zostanie on wyłączony i nie będzie można go ponownie włączyć, dopóki błędy nie zostaną poprawione. Warto dwukrotnie sprawdzić, czy wszystko jest w porządku, ponieważ to wyjaśnia objawy, które pojawiają się.
Daniel Morritt
Niestety w XE7 nie mogę odtworzyć twojego problemu, wszystko wydaje się działać zgodnie z oczekiwaniami: budowanie z wiersza poleceń zarówno z, /t:Hellojak i ze środowiska IDE za pomocą prawego przycisku myszy w Project Manager - Targets - Hello. Dodałem Custom.targetsdo projektu, klikając prawym przyciskiem myszy w Menedżerze Projektu - Dodaj - (przeglądając plik). Ścieżka jest tym samym katalogiem, co plik .dproj.
Ondrej Kelle

Odpowiedzi:

1

Delphi sam generuje całą zawartość dproj, a ten niestandardowy import będzie zawsze usuwany.

Możesz napisać własne pliki msbuild xml, ale dproj należy do Delphi.

Chyba że masz kod źródłowy lub nie chcesz naprawiać idei, których nie możesz zrobić.

Jeśli naprawdę chcesz elastycznego sposobu XML do budowania projektów delphi i tworzenia wielu celów, wypróbuj want or want vnext (my fork on bitbucket)

Warren P
źródło
1

Włączyłbym ręcznie plik docelowy i kompilowałbym zewnętrznie za pomocą MSBuild zamiast z IDE, ponieważ podczas kompilowania z IDE jest trochę bałagan, aby wiedzieć, którą konfigurację i cel zastosowałeś (czy ten, który został kliknięty w projekcie? Lub ten z włączony cel? nie otrzymujesz żadnej wizualnej wskazówki, że cel niestandardowy jest włączony).

Zwykle robię to przed, Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"więc nie pojawią się w IDE (istnieją, ale są ukryte dla programistów).

Na przykład moje projekty Delphi XE4 kończą się:

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

Mój plik .targets definiuje niestandardowe „PropertyGroup” i „Target” z warunkiem, więc będą one stosowane tylko w przypadku wywołania z programu 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>

Następnie skompiluj go z:

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

Takie podejście pozwala dostosować cele kompilacji, aby upewnić się, że każda aplikacja otrzymuje poprawne ustawienia bez wpływu zmian wprowadzanych przez kogokolwiek.

Fran
źródło