Delphi XE özel oluşturma hedefi her zaman devre dışı


177

.targetsIDE aracılığıyla bir Delphi XE projesine dahil ettiğim özel bir MSBuild dosyası oluşturdum ve Proje Yöneticisi'nin bağlam menüsünden etkinleştirdim. Dosya doğrulasa da, proje dosyasını yeniden kaydettikten sonra her zaman devre dışı kalır.

İşte, hedefler dosyasının basitleştirilmiş bir sürümü Custom.targets.

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

Tek başına bir dosya olarak bu beklendiği gibi çalışır: yazarak ...

MSBuild Custom.target /t:Hello

... komut satırında beklenen iletiyi verir.

Custom.targetsIDE üzerinden bir Delphi projesine eklenmesi dosyayı beklendiği gibi Proje Yöneticisi'nde görüntüler ve .dprojdosya şimdi satırı içerir ...

<TargetsFile Include="Custom.targets"/>

IDE'nin Proje Yöneticisi'nde dosyayı sağ tıklatıp seçtim Enable. Ancak proje oluşturulduğunda Buildmesaj penceresi görüntülenir:

[MSBuild Warning] Özel hedefler (1): Devre dışı bırakılan içe aktarma yoksayılıyor: PathToProjectSource\\Custom.targets

Proje Yöneticisi'nde yeniden sağ tıklatıldığında Enable, beklenen yerine hala seçenek gösterilir Disable.

Komut satırında MSBuild ProjectName.dproj /t:Helloda başarısız olur.

.dprojSatır eklemek için dosyayı hacklemeyi denedim ...

<Import Project="Custom.targets"/>

Yazmak MSBuild ProjectName.dproj /t:Helloartık işe yarıyor. Ancak bir dahaki sefere proje dosyasını IDE'den kaydettiğimde <Import>deyim kaldırılıyor.

Neyin yanlış gittiğini bilen var mı lütfen?


10
Komut satırında msbuild kullanarak sizin örnekte göstermek Custom.target başka herhangi bir yerde kullanırken Custom.targets . Hangisi?
Kenneth Cochran

4
İyi nokta - Ben kod çok bakan rağmen fark etmemişti. Birkaç gün (hastanede!) Üzerinde Delphi ile bir makineye alamıyorum, ancak mümkün olduğunda "hedef" veya "hedefler" kullanarak kodu çalışacağız.
delphidabbler

6
Değil bir Delphi kullanıcı, ancak uygun bu bütün .targets dosyaları geçerli MSBuild komut hataları serbest içermelidir. Dosyada herhangi bir hata varsa, bildirim alırsınız ve proje geçersiz .targets dosyasına başvurursa, devre dışı bırakılır ve hatalar düzeltilene kadar yeniden etkinleştirilemez. Aldığınız belirtileri açıkladığı için her şeyin doğru olduğunu iki kez kontrol etmeye değer olabilir.
Daniel Morritt

Ne yazık ki XE7 sorununuzu yeniden oluşturamıyorum, her şey beklendiği gibi çalışıyor gibi görünüyor: Komut satırı isteminden /t:Hellove IDE'den Proje Yöneticisi - Hedefler - Merhaba sağ tıklamayla bina . Custom.targetsProje Yöneticisi - Ekle - (dosyaya göz atıldı) üzerine sağ tıklayarak projeye ekledim . Yol, .dproj dosyasıyla aynı dizindir.
Ondrej Kelle

Yanıtlar:


1

Delphi tüm dproj içeriğinin kendisini oluşturur ve bu özel içe aktarma her zaman silinir.

Kendi msbuild xml dosyalarınızı yazabilirsiniz ancak dproj Delphi'ye aittir.

Kaynak kodunuz yoksa ya da ide maymunu yama yapmaya istekli değilseniz, bunu yapamazsınız.

Gerçekten delphi projeleri oluşturmak ve hedefler bolca oluşturmak için esnek bir xml yolu istiyorsanız istemek veya vnext (bitbucket benim çatal) istiyorum deneyin


1

Hedefler dosyasını el ile dahil eder ve IDE yerine MSBuild kullanarak harici olarak oluştururdum, çünkü IDE'den derlerken hangi yapılandırmayı ve hedefi uyguladığınızı bilmek biraz dağınıktır (veya projeye tıklanmış mıdır?) Özel bir hedefin etkin olduğuna dair herhangi bir görsel ipucu alamazsınız).

Genellikle bunu daha önce yaparım, Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"böylece IDE'de gösterilmezler (var olurlar, ancak geliştiricilere gizlenirler).

Örneğin, Delphi XE4 projelerim şununla bitiyor:

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

.Targets dosyam koşullu özel bir "Özellik Grubu" ve "Hedef" tanımlar, bu nedenle yalnızca MSBuild'den çağrıldığında uygulanır:

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

Sonra şununla derleyin:

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

Bu yaklaşımı kullanmak, her uygulamanın, herkes tarafından yapılan değişikliklerden etkilenmeden doğru ayarları aldığından emin olmak için oluşturma hedeflerini özelleştirmenizi sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.