MacOSX'te bir uygulama paketi oluşturmanın iki yolu vardır: Easy ve Ugly.
Kolay yol sadece XCode'u kullanmaktır. Bitti.
Sorun, bazen yapamazsınız.
Benim durumumda, diğer uygulamaları oluşturan bir uygulama geliştiriyorum. Kullanıcının XCode yüklü olduğunu varsayamıyorum. Ayrıca uygulamamın bağlı olduğu kitaplıkları oluşturmak için MacPorts kullanıyorum . Dağıtmadan önce bu dylib'lerin uygulama ile birlikte paketlendiğinden emin olmam gerekiyor.
Sorumluluk reddi: Bu yazıyı yazmak için tamamen vasıfsızım, içindeki her şey Apple belgelerinden parıldadı, mevcut uygulamaları ve deneme yanılma yöntemlerini birbirinden ayırdı. Benim için işe yarıyor, ancak büyük olasılıkla yanlış. Herhangi bir düzeltmeniz varsa lütfen bana e-posta gönderin.
Bilmeniz gereken ilk şey, uygulama paketinin sadece bir dizin olduğudur.
Varsayımsal bir foo.app yapısını inceleyelim.
foo.app/
İçindekiler /
Info.plist
Mac os işletim sistemi/
foo
Kaynaklar /
foo.icns
Info.plist düz bir XML dosyasıdır. Bunu bir metin düzenleyici veya XCode ile birlikte gelen Özellik Listesi Düzenleyici uygulamasıyla düzenleyebilirsiniz. (/ Developer / Applications / Utilities / dizinindedir).
Dahil etmeniz gereken temel şeyler şunlardır:
CFBundleName - Uygulamanın adı.
CFBundleIcon - İçindekiler / Kaynaklar dizininde olduğu varsayılan bir Simge dosyası. Simgeyi oluşturmak için Icon Composer uygulamasını kullanın. (Ayrıca / Developer / Applications / Utilities / dizinindedir) Bir png'yi penceresine sürükleyip bırakabilirsiniz ve sizin için otomatik olarak mip düzeylerini oluşturmalısınız.
CFBundleExecutable - İçerik / MacOS / alt klasörde olduğu varsayılan yürütülebilir dosyanın adı.
Çok daha fazla seçenek var, yukarıda listelenenler yalnızca minimum olanlardır. Info.plist
dosyası ve
Uygulama paketi yapısıyla ilgili bazı Apple belgeleri burada
.
Ayrıca, örnek bir Info.plist burada verilmiştir.
<? 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-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> UYGULAMA </string>
<key> IFMajorVersion </key>
<integer> 0 </integer>
<key> IFMinorVersion </key>
<integer> 1 </integer>
</dict>
</plist>
Mükemmel bir dünyada, çalıştırılabilir dosyanızı İçerik / MacOS / dizinine bırakabilir ve işiniz bitebilir. Ancak, uygulamanızın standart olmayan herhangi bir dylib bağımlılığı varsa çalışmaz. Windows gibi, MacOS de kendine özgü bir DLL Cehennemi ile birlikte gelir .
Bağlandığınız kitaplıkları oluşturmak
için MacPorts kullanıyorsanız , dylib'lerin konumları çalıştırılabilir dosyanıza sabit kodlanacaktır. Uygulamayı tam olarak aynı konumda olan bir makinede çalıştırırsanız, sorunsuz çalışır. Ancak çoğu kullanıcı bunları yüklemeyecektir; uygulamanızı çift tıkladıklarında, yalnızca çökecektir.
Çalıştırılabilir dosyayı dağıtmadan önce, yüklediği tüm dylib'leri toplamanız ve bunları uygulama paketine kopyalamanız gerekir. Ayrıca yürütülebilir dosyayı, dylib'leri doğru yerde arayacak şekilde düzenlemeniz gerekecektir. yani bunları nereye kopyaladığınız.
Çalıştırılabilir bir dosyayı elle düzenlemek tehlikeli geliyor, değil mi? Neyse ki yardımcı olacak komut satırı araçları var.
otool -L çalıştırılabilir_adı
Bu komut, uygulamanızın bağlı olduğu tüm dylib'leri listeleyecektir. System / Library veya usr / lib klasöründe OLMAYAN herhangi birini görürseniz, bunlar uygulama paketine kopyalamanız gerekenlerdir. Bunları / Contents / MacOS / klasörüne kopyalayın. Ardından, yeni dylib'leri kullanmak için yürütülebilir dosyayı düzenlemeniz gerekir.
Öncelikle, -headerpad_max_install_names bayrağını kullanarak bağladığınızdan emin olmanız gerekir. Bu sadece yeni dylib yolu öncekinden daha uzunsa, ona yer açılmasını sağlar.
İkinci olarak, her dylib yolunu değiştirmek için install_name_tool kullanın.
install_name_tool - mevcut_path_to_dylib @ execable_path / blah.dylib yürütülebilir_adı değiştirin
Pratik bir örnek olarak, uygulamanızın libSDL kullandığını ve otool'un konumunu "/opt/local/lib/libSDL-1.2.0.dylib" olarak listelediğini varsayalım.
Önce bunu uygulama paketine kopyalayın.
cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/
Ardından yeni konumu kullanmak için yürütülebilir dosyayı düzenleyin (NOT: -headerpad_max_install_names bayrağıyla oluşturduğunuzdan emin olun)
install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @ execable_path / libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo
Whew, neredeyse bitti. Şimdi mevcut çalışma diziniyle ilgili küçük bir sorun var.
Uygulamanızı başlattığınızda mevcut dizin, uygulamanın bulunduğu yerin yukarısındaki dizin olacaktır. Örneğin: foo.app dosyasını / Applcations klasörüne yerleştirirseniz, uygulamayı başlattığınızda mevcut dizin / Applications klasörü olacaktır. Beklediğiniz gibi /Applications/foo.app/Contents/MacOS/ değil.
Bunu hesaba katmak için uygulamanızı değiştirebilir veya mevcut dizini değiştirecek ve uygulamanızı başlatacak bu sihirli küçük başlatıcı komut dosyasını kullanabilirsiniz.
#! / bin / bash
cd "$ {0% / *}"
./foo
Info.plist dosyasını CFBundleExecutable'ın önceki çalıştırılabilir dosyayı değil başlatma komut dosyasını gösterecek şekilde ayarladığınızdan emin olun .
Tamam, şimdi hepsi bitti. Neyse ki, tüm bunları öğrendikten sonra onu bir yapı betiğine gömüyorsunuz.