Target build kustom Delphi XE selalu dinonaktifkan

177

Saya telah membuat .targetsfile MSBuild khusus yang saya sertakan dalam proyek Delphi XE melalui IDE dan mengaktifkannya dari menu konteks Project Manager. Meskipun file divalidasi, selalu dinonaktifkan setelah saya menyimpan kembali file proyek.

Berikut adalah versi sederhana dari file target, bernama Custom.targets.

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

Sebagai file yang berdiri sendiri ini berfungsi seperti yang diharapkan: mengetik ...

MSBuild Custom.target /t:Hello

... di baris perintah memberikan pesan yang diharapkan.

Menambahkan Custom.targetske proyek Delphi melalui IDE menampilkan file di Manajer Proyek seperti yang diharapkan, dan .dprojfile sekarang berisi baris ...

<TargetsFile Include="Custom.targets"/>

Saya mengklik kanan file di Manajer Proyek IDE dan memilih Enable. Tetapi ketika proyek dibangun, Buildjendela pesan menampilkan:

[Peringatan MSBuild] Custom.targets (1): Mengabaikan impor yang dinonaktifkan: PathToProjectSource\\Custom.targets

Mengklik kanan lagi di Project Manager masih menunjukkan Enableopsi alih-alih yang diharapkan Disable.

Di baris perintah MSBuild ProjectName.dproj /t:Hellojuga gagal.

Saya sudah mencoba meretas .dprojfile untuk menambahkan baris ...

<Import Project="Custom.targets"/>

Mengetik MSBuild ProjectName.dproj /t:Hellosekarang berfungsi. Tetapi lain kali saya menyimpan file proyek dari IDE <Import>pernyataan itu dihapus.

Adakah yang tahu apa yang salah?

delphidabbler
sumber
10
Dalam contoh Anda menggunakan msbuild dari baris perintah Anda menunjukkan Custom.target sementara di mana pun Anda menggunakan Custom.target . Yang mana itu?
Kenneth Cochran
4
Tempat yang bagus - Saya tidak memperhatikan bahwa meskipun banyak menatap kode. Saya tidak bisa mendapatkan mesin dengan Delphi selama beberapa hari (di rumah sakit!), Tetapi akan mencoba kode menggunakan "target" atau "target" secara konsisten ketika saya bisa.
delphidabbler
6
Bukan pengguna Delphi, tetapi menurut ini Semua. File widget harus mengandung skrip MSBuild yang valid, bebas dari kesalahan. Jika file memiliki kesalahan, Anda diberitahu dan, jika proyek referensi file .targets yang tidak valid, itu dinonaktifkan dan tidak dapat diaktifkan kembali sampai kesalahan diperbaiki. Mungkin perlu dicek ganda semuanya benar karena itu menjelaskan gejala yang Anda dapatkan.
Daniel Morritt
Sayangnya di XE7 saya tidak dapat mereproduksi masalah Anda, semuanya tampaknya berfungsi seperti yang diharapkan: membangun dari command line dengan /t:Helloserta dari IDE dengan klik kanan di Project Manager - Target - Hello. Saya telah menambahkan Custom.targetske proyek dengan mengklik kanan pada Manajer Proyek - Tambah - (mencari file). Path adalah direktori yang sama dengan file .dproj.
Ondrej Kelle

Jawaban:

1

Delphi menghasilkan seluruh konten dproj itu sendiri dan impor kustom ini akan selalu dihapus.

Anda bisa menulis file msbuild xml Anda sendiri tetapi dproj itu milik Delphi.

Kecuali Anda memiliki kode sumber atau bersedia untuk menambal ide yang tidak dapat Anda lakukan.

Jika Anda benar-benar menginginkan cara xml yang fleksibel untuk membangun proyek delphi dan membuat target yang banyak, cobalah atau ingin vnext (fork saya di bitbucket)

Warren P
sumber
1

Saya akan menyertakan file target secara manual dan membangun secara eksternal menggunakan MSBuild daripada dari IDE, karena ketika mengkompilasi dari IDE agak berantakan untuk mengetahui konfigurasi dan target yang telah Anda terapkan (apakah yang diklik pada proyek? Atau yang dari target diaktifkan? Anda tidak mendapatkan petunjuk visual bahwa target kustom diaktifkan).

Saya biasanya melakukannya sebelum Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"jadi mereka tidak akan tampil di IDE (mereka ada, tetapi disembunyikan untuk pengembang).

Sebagai contoh proyek Delphi XE4 saya diakhiri dengan:

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

File .targets saya menetapkan "PropertyGroup" dan "Target" kustom dengan syarat, sehingga hanya akan berlaku ketika dipanggil dari 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>

Kemudian kompilasi dengan:

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

Dengan menggunakan pendekatan ini, Anda dapat menyesuaikan target pembuatan untuk memastikan setiap aplikasi mendapatkan pengaturan yang benar tanpa terpengaruh oleh perubahan yang dilakukan oleh siapa pun.

Fran
sumber