MacOSX, ईजी और अग्ली पर ऐप बंडल बनाने के दो तरीके हैं।
आसान तरीका सिर्फ XCode का उपयोग करना है। किया हुआ।
समस्या यह है कि कभी-कभी आप ऐसा नहीं कर सकते।
मेरे मामले में मैं एक ऐप बना रहा हूं जो अन्य ऐप बनाता है। मैं यह नहीं मान सकता कि उपयोगकर्ता के पास XCode स्थापित है। मैं अपने ऐप पर निर्भर पुस्तकालयों के निर्माण के लिए MacPorts का भी उपयोग कर रहा हूं । मुझे यह सुनिश्चित करने की आवश्यकता है कि इन डिलेबियों को मैं वितरित करने से पहले ऐप के साथ बंडल कर दूं।
अस्वीकरण: मैं इस पोस्ट को लिखने के लिए पूरी तरह से अयोग्य हूँ, इसमें मौजूद सभी चीज़ों को ऐप्पल डॉक्स से अलग किया गया है, मौजूदा एप्लिकेशन और परीक्षण और त्रुटि को छोड़कर। यह मेरे लिए काम करता है, लेकिन सबसे अधिक गलत है। यदि आपके पास कोई सुधार है तो कृपया मुझे ईमेल करें।
सबसे पहले आपको पता होना चाहिए कि एक ऐप बंडल केवल एक निर्देशिका है।
आइए एक काल्पनिक foo.app की संरचना की जांच करें।
foo.app/
सामग्री /
Info.plist
मैक ओ एस/
foo
संसाधन /
foo.icns
Info.plist एक सादा XML फ़ाइल है। आप इसे एक पाठ संपादक या संपत्ति सूची संपादक ऐप के साथ संपादित कर सकते हैं जो XCode के साथ बंडल में आता है। (यह / डेवलपर / अनुप्रयोग / उपयोगिताएँ / निर्देशिका में है)।
आपको जिन महत्वपूर्ण चीजों को शामिल करना है वे हैं:
CFBundleName - ऐप का नाम।
CFBundleIcon - एक आइकन फ़ाइल जिसमें सामग्री / संसाधन dir है। आइकन बनाने के लिए आइकन संगीतकार ऐप का उपयोग करें। (यह / डेवलपर / एप्लिकेशन / यूटिलिटीज / डायरेक्टरी में भी है) आप इसे केवल खिड़की पर एक पीएनजी खींच सकते हैं और छोड़ सकते हैं और स्वचालित रूप से आपके लिए एमआईपी-स्तर उत्पन्न करना चाहिए।
CFBundleExecutable - निष्पादन योग्य फ़ाइल का नाम सामग्री / MacOS / उप-फ़ोल्डर में माना जाता है।
बहुत अधिक विकल्प हैं, जो ऊपर सूचीबद्ध हैं वे केवल नंगे न्यूनतम हैं। यहाँ Info.plist
फ़ाइल और
ऐप बंडल संरचना पर कुछ Apple प्रलेखन हैं
।
इसके अलावा, यहाँ एक नमूना Info.plist है।
<? xml संस्करण = "1.0" एन्कोडिंग = "UTF-8"?>
<! DOCTYPE plist सार्वजनिक "- // Apple कंप्यूटर // DTD PLIST 1.0 // EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist संस्करण = "1.0">
<Dict>
<कुंजी> CFBundleGetInfoString </ कुंजी>
<String> फू </ स्ट्रिंग>
<कुंजी> CFBundleExecutable </ कुंजी>
<String> foo </ स्ट्रिंग>
<कुंजी> CFBundleIdentifier </ कुंजी>
<String> com.your-कंपनी-name.www </ स्ट्रिंग>
<कुंजी> CFBundleName </ कुंजी>
<String> foo </ स्ट्रिंग>
<कुंजी> CFBundleIconFile </ कुंजी>
<String> foo.icns </ स्ट्रिंग>
<कुंजी> CFBundleShortVersionString </ कुंजी>
<String> 0.01 </ स्ट्रिंग>
<कुंजी> CFBundleInfoDictionaryVersion </ कुंजी>
<String> 6.0 </ स्ट्रिंग>
<कुंजी> CFBundlePackageType </ कुंजी>
<String> एपीपीएल </ स्ट्रिंग>
<कुंजी> IFMajorVersion </ कुंजी>
<पूर्णांक> 0 </ पूर्णांक>
<कुंजी> IFMinorVersion </ कुंजी>
<पूर्णांक> 1 </ पूर्णांक>
</ Dict>
</ Plist>
एक आदर्श दुनिया में आप बस अपने निष्पादन योग्य सामग्री / MacOS / dir में छोड़ सकते हैं और किया जा सकता है। हालाँकि, यदि आपके ऐप में कोई गैर-मानक dylib निर्भरता है तो यह काम नहीं करेगा। विंडोज की तरह, मैकओएस यह डीएलएल हेल का अपना विशेष प्रकार है ।
यदि आप उन पुस्तकालयों के निर्माण के लिए MacPorts का उपयोग कर रहे हैं , जिनके खिलाफ आप लिंक करते हैं, तो dylibs के स्थान आपके निष्पादन योग्य में हार्ड-कोड किए जाएंगे। यदि आप एक ऐसी मशीन पर ऐप चलाते हैं जिसमें ठीक उसी स्थान पर dylibs हैं, तो यह ठीक चलेगा। हालाँकि, अधिकांश उपयोगकर्ताओं ने उन्हें स्थापित नहीं किया होगा; जब वे आपके ऐप को डबल-क्लिक करेंगे तो यह दुर्घटनाग्रस्त हो जाएगा।
इससे पहले कि आप आपको निष्पादन योग्य वितरित करें, आपको उन सभी dylibs को इकट्ठा करना होगा जो इसे लोड करते हैं और उन्हें ऐप बंडल में कॉपी करते हैं। आपको निष्पादन योग्य को संपादित करने की भी आवश्यकता होगी ताकि यह सही जगह पर dylibs के लिए दिखेगा। यानी जहां आपने उन्हें कॉपी किया है।
एक संपादन योग्य हाथ खतरनाक लगता है? सौभाग्य से मदद करने के लिए कमांड लाइन उपकरण हैं।
ओटूल-एल निष्पादन योग्य_नाम
यह कमांड उन सभी dylibs को सूचीबद्ध करेगा जो आपका ऐप निर्भर करता है। यदि आपको कोई ऐसा सिस्टम या लाइब्रेरी / usr / lib फ़ोल्डर दिखाई नहीं देता है, तो वे हैं जिन्हें आपको ऐप बंडल में कॉपी करना होगा। उन्हें / सामग्री / MacOS / फ़ोल्डर में कॉपी करें। अगला आपको नई dylibs का उपयोग करने के लिए निष्पादन योग्य को संपादित करने की आवश्यकता होगी।
सबसे पहले, आपको यह सुनिश्चित करने की आवश्यकता है कि आप -headerpad_max_install_names ध्वज का उपयोग करके लिंक करें। यह सिर्फ यह सुनिश्चित करता है कि यदि नया डाइलिब पथ लंबा है, तो पहले वाला, इसके लिए जगह होगी।
दूसरा, प्रत्येक dylib पथ को बदलने के लिए install_name_tool का उपयोग करें।
install_name_tool -change मौजूदा_पठ_तो_भार्य @ निष्पादन योग्य_पथ / ब्लाह.डिबलिब निष्पादन योग्य_नाम
एक व्यावहारिक उदाहरण के रूप में, मान लीजिए कि आपका ऐप libSDL का उपयोग करता है , और ओटोल सूचियां "/opt/local/lib/libSDL-1.2.0.dylib" के रूप में इसका स्थान है।
सबसे पहले इसे एप बंडल में कॉपी करें।
cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/
फिर नए स्थान का उपयोग करने के लिए निष्पादन योग्य को संपादित करें (नोट: सुनिश्चित करें कि आपने इसे -headerpad_max_install_ames ध्वज के साथ बनाया है)
स्थापित करें
वाह, हम लगभग पूरा कर चुके हैं। अब वर्तमान कार्यशील निर्देशिका के साथ एक छोटा मुद्दा है।
जब आप अपना ऐप शुरू करते हैं तो वर्तमान निर्देशिका उस निर्देशिका के ऊपर होगी जहां एप्लिकेशन स्थित है। उदाहरण के लिए: यदि आप foo.app को / Applcations फ़ोल्डर में रखते हैं तो वर्तमान निर्देशिका जब आप एप्लिकेशन लॉन्च करेंगे / एप्लिकेशन फ़ोल्डर होगा। जैसा कि आप उम्मीद कर सकते हैं /Applications/foo.app/Contents/MacOS/ नहीं।
आप इसके लिए अपने ऐप को बदल सकते हैं, या आप इस मैजिक लिटिल लॉन्चर स्क्रिप्ट का उपयोग कर सकते हैं, जो वर्तमान डायरेक्टरी को बदल देगी और आपके ऐप को लॉन्च करेगी।
#! / Bin / bash
सीडी "$ {0% / *}"
./foo
सुनिश्चित करें कि आप Info.plist फ़ाइल को समायोजित करते हैं ताकि CFBundleExecutable लॉन्च स्क्रिप्ट की ओर इशारा करता है और पिछले निष्पादन योग्य के लिए नहीं।
ठीक है, अब सब किया। सौभाग्य से, एक बार जब आप यह सब सामान जानते हैं तो आप इसे एक निर्माण स्क्रिप्ट में दफन कर देते हैं।