SORU
20 EKİM 2009, Salı


Bina) Uygulaması Bundle

Merhaba Böyle büyük mükafat kullanmadan) bir uygulama yaptım varsayalım. GCC ile derleme sonra çeşitli diğer kütüphaneler için bağlantılı olan bir yürütülebilir. Bu kütüphaneler, biraz daha dinamik olarak standart olmayan diğer sistem kitaplıkları ile bağlantılı olabilir

Herhangi bir aracı olan var olan bir arı) Uygulama paketi ilk yapılması gereken dizin yapılarını ve daha sonra özyinelemeli olarak kopyalama/kontrol/tamir bağlantılar emin olmak için tüm dinamik bağımlılıkları da uygulaması bundle?

Böyle bir şey yazmayı deneyebilirim ama eğer böyle bir şey zaten var mı diye merak ediyordum.

CEVAP
14 Temmuz 2010, ÇARŞAMBA


Film, Kolay ve Çirkin bir uygulama paketi oluşturmak için iki yol vardır.

Kolay yolu sadece böyle büyük mükafat kullanmaktır. Bitti.

Sorun olmaz bazen.

Benim durumumda diğer uygulamalar oluşturur bir uygulama inşa ediyorum. Kullanıcı yüklü böyle büyük mükafat vardır kabul edemem. Ayrıca MacPorts benim app bağlıdır kitaplıkları oluşturmak için kullanıyorum. Bu dylibs ben dağıtmadan önce uygulama ile birlikte almak emin olmak istiyorum.

Yasal Uyarı:Bu yazı, her şeyi yazmak için yetersiz olduğumu Apple dokümanlar parıldıyordu olmuştur, mevcut uygulamalar parçalayıp, ve deneme yanılma. Benim için çalışıyor, ama büyük ihtimalle yanlış. Lütfen eğer herhangi bir düzeltme varsa bana e-posta.

Bilmeniz gereken ilk şey app bir paket sadece bir dizin olduğunu.
Hadi farazi bir foo yapısını incelemek.app.

foo.app/
    Contents/
        Info.plist
        MacOS/
            foo
        Resources/
            foo.icns

Bilgi.plist düz bir XML dosyasıdır. Bir metin düzenleyicisi veya Özellik Listesi ile düzenleyebilirsiniz birlikte Güncellemelerinden ile birlikte Editör uygulaması. (/Uygulamalar/Yardımcı Programlar/dizin)/ Geliştirici.

Çıkar için gereken önemli şeyler:

CFBundleName- Uygulamanın adını.

CFBundleİcon- Bir Simge dosyası İçindekiler/Kaynaklar olarak kabul dir. Simge Besteci uygulama simgesini oluşturmak için kullanın. (/Geliştirici/Uygulamalar/Yardımcı Programlar/ directory) Sadece sürükle ve pencere üzerine bir png bırakın ve otomatik olarak sizin için mip-düzeyleri oluştursun.

CFBundleExecutable- Çalıştırılabilir dosya İçeriği olarak kabul adı/MacOS alt klasör/.

Daha fazla seçenek, yukarıda listelenen minimum düzeyde olan bir sürü vardır. İşte bazı Apple belgelerine Info.plist ve dosya App bundle structure.

Ayrıca, Burada örnek bir Bilgi.plıst.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleGetInfoString</key>
  <string>Foo</string>
  <key>CFBundleExecutable</key>
  <string>foo</string>
  <key>CFBundleIdentifier</key>
  <string>com.your-company-name.www</string>
  <key>CFBundleName</key>
  <string>foo</string>
  <key>CFBundleIconFile</key>
  <string>foo.icns</string>
  <key>CFBundleShortVersionString</key>
  <string>0.01</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>IFMajorVersion</key>
  <integer>0</integer>
  <key>IFMinorVersion</key>
  <integer>1</integer>
</dict>
</plist>

Mükemmel bir dünyada eğer bir yürütülebilir damla olabilir. Contents/MacOS dir/ tamamdır. Eğer herhangi bir uygulama var ise, standart dışı bir işe yaramaz bağımlılıkları dylib. Windows, MacOS Gibi DLL Hellkendi özel bir tür ile birlikte gelir.

Eğer MacPorts karşı bağlantı kitaplıkları oluşturmak için kullanıyorsanız, bu dylibs yerleri yürütülebilir içine kodlanmış olacak. Eğer aynı yerde dylibs olan bir makine üzerinde uygulamayı çalıştırmak için iyi çalışır. Ancak, çoğu kullanıcı onları yüklü olmayacak; onlar çift uygulamanızı ne zaman geçsem.

Tüm dylibs toplamak gerekir yürütülebilir dağıtmadan önce yükler ve app bundle içine kopyalayın. Aynı zamanda doğru yerde dylibs arayacaktır çalıştırır düzenlemeniz gerekir. onları kopyalanan yerde yani.

Çalıştırılabilir bir dosya düzenleme tehlikeli geliyor sağ el? Neyse ki vardır komut satırı yardımcı olan araçlar.

otool -L executable_name

Bu komutu uygulamanıza bağlı tüm dylibs listesi. Eğer bu Sistem/Kitaplık veya usr/lib klasöründe OLMAYAN herhangi birini görürseniz, o app bundle içine kopyalayın gerekir olanlardır. / Klasör MacOS//İçeriğini kopyalayın. Bir sonraki yürütülebilir yeni dylibs kullanmak için düzenlemeniz gerekir.

İlk olarak, kullanarak headerpad_max_install_names bayrağı bağlantı emin olmak gerekir. Bu sadece yeni dylib yolu daha sonra bir önceki ise, bunun için oda olacak emin olur.

İkinci olarak, install_name_tool her dylib yolunu değiştirmek için kullanın.

install_name_tool -change existing_path_to_dylib @executable_path/blah.dylib executable_name

Pratik bir örnek olarak, diyelim ki sizin app "/local/lib/libSDL-1.2.0./opt olarak konum libSDL ve otool listeleri kullanır ki".dylib

İlk app bundle içine kopyalayın.

cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/

Daha sonra yeni konuma (NOT: yaptığınız emin-headerpad_max_install_names bayrağı)ile kullanmak için çalıştırılabilir dosyayı Düzenle

install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @executable_path/libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo

Vay, neredeyse bitirdik. Şimdi geçerli çalışma dizini ile küçük bir sorun var.

Eğer uygulama başlattığınızda, geçerli dizini uygulaması bulunduğu yukarıdaki dizin olacak. Eğer foo yerleştirin.örneğin: /İşlemleri uygulama sonra uygulamayı /Uygulamaları klasörü olacak başlattığınızda geçerli dizin klasör. /Uygulamalar/foo.app/İçerik/beklediğiniz gibi/ MacOS.

App bu hesaba değiştirebilir, veya geçerli dizini değiştirmek ve uygulaması başlatacak olan bu sihirli küçük başlatıcısı komut dosyası kullanabilirsiniz.

#!/bin/bash
cd "${0%/*}"
./foo

Bilgi ayarlamak emin olun.böylece dosya plistCFBundleExecutablebir önceki yürütülebilir başlatmak için komut dosyası için değil, puan.

Tamam, şimdi hepsi bitti. Neyse ki, bir kez bu şeyler inşa bir komut göm.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 0TACTICAL0HIPPY0

    0TACTICAL0HI

    30 EYLÜL 2012
  • gadgetgal38

    gadgetgal38

    9 HAZİRAN 2009
  • TechSmartt

    TechSmartt

    29 Aralık 2010