मैं कमांड लाइन टूल्स का उपयोग करते हुए मैक ओएस एक्स के लिए एक अच्छी दिखने वाली डीएमजी कैसे बनाऊं?


212

मुझे मैक एप्लिकेशन के लिए एक अच्छा इंस्टॉलर बनाने की आवश्यकता है। मैं चाहता हूं कि यह एक पूर्वनिर्धारित आकार, लेआउट और पृष्ठभूमि छवि के साथ एक डिस्क छवि (डीएमजी) हो।

मुझे एक स्क्रिप्ट में यह प्रोग्रामेटिक रूप से करने की आवश्यकता है, एक मौजूदा बिल्ड सिस्टम में एकीकृत होना (वास्तव में एक पैक सिस्टम का अधिक होना, क्योंकि यह केवल इंस्टॉलर बनाते हैं। बिल्ड अलग से किए जाते हैं)।

मेरे पास पहले से ही डीएमजी निर्माण "हड्युटिल" का उपयोग करके किया गया है, जो मुझे अभी तक नहीं मिला है वह यह है कि एक आइकन लेआउट कैसे बनाया जाए और एक पृष्ठभूमि बिटमैप निर्दिष्ट करें।


1
यह अलग पूछें के लिए कुछ नहीं है?
लेनर होयट

जवाबों:


199

बहुत शोध के बाद, मैं इस उत्तर के साथ आया हूं, और मैं इसे अपने प्रश्न के उत्तर के रूप में यहां संदर्भ के लिए यहां रख रहा हूं:

  1. सुनिश्चित करें कि "प्राथमिकता उपकरणों के लिए पहुँच सक्षम करें" सिस्टम वरीयताएँ >> यूनिवर्सल एक्सेस में जाँच की गई है। AppleScript के लिए काम करना आवश्यक है। इस परिवर्तन के बाद आपको रिबूट करना पड़ सकता है (यह मैक ओएस एक्स सर्वर 10.4 पर अन्यथा काम नहीं करता है)।

  2. एक R / W DMG बनाएँ। यह परिणाम की तुलना में बड़ा होना चाहिए। इस उदाहरण में, bash वेरिएबल "आकार" में Kb का आकार होता है और "स्रोत" bash वेरिएबल में फ़ोल्डर की सामग्री को DMG में कॉपी किया जाएगा:

    hdiutil create -srcfolder "${source}" -volname "${title}" -fs HFS+ \
          -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${size}k pack.temp.dmg
    
  3. डिस्क छवि को माउंट करें, और डिवाइस नाम संग्रहीत करें (आप इस ऑपरेशन के बाद कुछ सेकंड के लिए नींद का उपयोग करना चाह सकते हैं):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. DMG में ".background" नामक फोल्डर में बैकग्राउंड पिक्चर (PNG फॉर्मेट में) को स्टोर करें और उसका नाम "बैकग्राउंडप्रीचरनाम" वैरिएबल में स्टोर करें।

  5. दृश्य शैलियों को सेट करने के लिए AppleScript का उपयोग करें (.app का नाम परिवर्तनशील "एप्लिकेशननेम" में होना चाहिए, आवश्यकतानुसार अन्य गुणों के लिए चर का उपयोग करें):

    echo '
       tell application "Finder"
         tell disk "'${title}'"
               open
               set current view of container window to icon view
               set toolbar visible of container window to false
               set statusbar visible of container window to false
               set the bounds of container window to {400, 100, 885, 430}
               set theViewOptions to the icon view options of container window
               set arrangement of theViewOptions to not arranged
               set icon size of theViewOptions to 72
               set background picture of theViewOptions to file ".background:'${backgroundPictureName}'"
               make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
               set position of item "'${applicationName}'" of container window to {100, 100}
               set position of item "Applications" of container window to {375, 100}
               update without registering applications
               delay 5
               close
         end tell
       end tell
    ' | osascript
    
  6. डीएमजी को ठीक से अनुमति देकर, इसे संपीड़ित और जारी करके समाप्त करें:

    chmod -Rf go-w /Volumes/"${title}"
    sync
    sync
    hdiutil detach ${device}
    hdiutil convert "/pack.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "${finalDMGName}"
    rm -f /pack.temp.dmg 
    

स्नो लेपर्ड पर, उपर्युक्त एप्स्क्रिप्ट, आइकन की स्थिति को सही ढंग से सेट नहीं करेगा - ऐसा लगता है कि यह स्नो लेपर्ड बग है। एक समाधान केवल आइकन सेट करने के बाद बंद / खुला कॉल करना है, अर्थात:

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open

1
अति उत्कृष्ट। उस के बारे में दो प्रश्न: 1. आप sleepछवि को टटोलने के बाद सलाह देते हैं । कितना लंबा? क्या प्रक्रिया के पूरा होने के लिए यह निर्धारित करना संभव नहीं है? delay 5आपके AppleScript में भी ऐसा ही है । मैं हमेशा इस तरह के मनमाने प्रतीक्षा से सावधान रहता हूं, उनके साथ कुछ बहुत बुरा अनुभव रहा है। 2. आपके चरण 6 में आप syncदो बार कॉल करते हैं - क्यों?
कोनराड रुडोल्फ

मुझे 'एप्लिकेशन के पंजीकरण के बिना अपडेट' कमांड के पूरा होने के लिए निर्धारित करने के लिए कोई रास्ता नहीं मिला है। मुझे यकीन नहीं है कि "हड्युटिल अटैचमेंट" के बाद नींद की आवश्यकता है, आपको दस्तावेज (मैन हड्युटिल) की जांच करनी होगी। सिंक को केवल एक बार कॉल करने की आवश्यकता होनी चाहिए, मैं इसे पुराने पुराने अच्छे सनोस दिनों से पुरानी आदत से दो बार करता हूं।
लुडविग ए। नोरिन

1
यह एप्सस्क्रिप्ट को माउस और कीबोर्ड इनपुट और अन्य चीजों का एक गुच्छा अनुकरण करने की अनुमति देता है।
लुडविग ए। नोरिन

1
यदि स्क्रिप्ट "एप्लिकेशन को पंजीकृत किए बिना अपडेट" लाइन पर कई बार लटकाती है, तो चरण 1 नहीं किया गया है (या अवांछनीय हो गया है)। मुझे यह मुश्किल तरीका लगा।
जे मेनार्ड K5ZC

मुझे लगता है कि मुझे थोड़ी गड़बड़ लगी - AppleScript में एक बेदखल है, जो कि चामोद को चलाने की कोशिश करने से पहले किया जाता है। chmod विफल हो जाएगा क्योंकि डिस्क अब हटा दी गई है।
तर्जुक

56

इसमें थोड़ा बैश स्क्रिप्ट है, जिसे create-dmg कहा जाता है , जो कस्टम पृष्ठभूमि, कस्टम आइकन पोजिशनिंग और वॉल्यूम नाम के साथ फैंसी DMGs बनाता है।

मैंने इसे उस कंपनी के लिए कई साल पहले बनाया था जिसे मैं उस समय चलाता था; यह तब से अन्य लोगों के योगदान पर जीवित है, और कथित तौर पर अच्छी तरह से काम करता है।

नोड-एपीडीएमजी भी है जो नोड.जेएस पर आधारित एक अधिक आधुनिक और सक्रिय प्रयास की तरह दिखता है; इसे भी देखें।


7
आपकी बैश स्क्रिप्ट का लिंक टूट गया है। क्या आप इसे github.com पर एक जिस्ट में डाल सकते हैं? धन्यवाद
dquimper

create-dmg आइकॉन को अच्छी तरह से पोजिशन नहीं करता है । यदि आपको इस सुविधा की आवश्यकता है, तो इसका उपयोग न करें।
laike9m

1
@ laike9m 5 साल से अधिक समय हो गया है क्योंकि मैंने इसे आखिरी बार छुआ है। मैं वास्तव में डीएमजी को मैक सॉफ्टवेयर वितरित करने का सबसे अच्छा तरीका नहीं मानता। इसलिए यह दूसरों के योगदान पर जीवित रहता है - उम्मीद है कि कोई व्यक्ति आइकन्स मुद्दे का भी पता लगाएगा।
एंड्रे टारनटोसव

3
@Zmey एक उपयोगकर्ता के रूप में, मैं अब तक ज़िप फ़ाइलों को पसंद करता हूं। /Applicationsयदि एप्लिकेशन यह पता लगाता है कि बोनस का पता लगाना है तो ऑटो-कॉपी करने के लिए बोनस अंक ~/Downloadsजॉन ग्रबेर का यह पुराना लेख भी देखें ।
एंड्री टारनटोसोव


37

वहाँ मत जाओ। एक दीर्घकालिक मैक डेवलपर के रूप में, मैं आपको आश्वस्त कर सकता हूं, कोई भी समाधान वास्तव में अच्छी तरह से काम नहीं कर रहा है। मैंने बहुत सारे समाधानों की कोशिश की, लेकिन वे सभी बहुत अच्छे नहीं हैं। मुझे लगता है कि समस्या यह है कि Apple वास्तव में आवश्यक डेटा के लिए मेटा डेटा प्रारूप का दस्तावेजीकरण नहीं करता है।

यहाँ मैं इसे लंबे समय से कर रहा हूँ, बहुत सफलतापूर्वक:

  1. एक नया DMG, राइट करने योग्य (!) बनाएं, जो अपेक्षित बाइनरी और रीडमी (स्पार्स काम करेगा) जैसी अतिरिक्त फ़ाइलों को रखने के लिए काफी बड़ा है।

  2. DMG को माउंट करें और इसे फाइंडर में मैन्युअल रूप से दें या ऐसा करने के लिए जो भी टूल आपको सूट करता है (एक अच्छे टूल के लिए नीचे की तरफ फाइलस्टॉर्म लिंक देखें)। पृष्ठभूमि छवि आमतौर पर एक छवि है जिसे हम डीएमजी पर एक छिपे हुए फ़ोल्डर (".something") में डालते हैं। अपने एप्लिकेशन की एक प्रति वहां रखें (कोई भी संस्करण, यहां तक ​​कि पुराना भी हो जाएगा)। अन्य फ़ाइलों (उपनाम, रीडमी, आदि) को कॉपी करें जो आप वहां चाहते हैं, फिर से, पुराने संस्करण बस ठीक कर देंगे। सुनिश्चित करें कि प्रतीक के सही आकार और स्थिति हैं (IOW, DMG को जिस तरह से आप चाहते हैं, उसे लेआउट करें)।

  3. DMG को फिर से अनमाउंट करें, सभी सेटिंग्स अब तक संग्रहीत की जानी चाहिए।

  4. एक डीएमजी स्क्रिप्ट बनाएँ, जो निम्नानुसार काम करती है:

    • यह DMG की नकल करता है, इसलिए मूल को फिर कभी नहीं छुआ जाता है।
    • यह प्रतिलिपि बनाता है।
    • यह सभी फाइलों को सबसे अधिक अद्यतित करता है (जैसे निर्माण के बाद नवीनतम ऐप)। आप बस कमांड लाइन पर उसके लिए mv या डिट्टो का उपयोग कर सकते हैं । ध्यान दें, जब आप उस तरह की फ़ाइल को बदलेंगे, तो आइकन वही रहेगा, स्थिति वही रहेगी, सब कुछ लेकिन फ़ाइल (या निर्देशिका) सामग्री एक ही रहेगी (कम से कम डिट्टो के साथ, जिसका उपयोग हम आमतौर पर उस कार्य के लिए करते हैं) । आप निश्चित रूप से पृष्ठभूमि छवि को दूसरे के साथ बदल सकते हैं (बस यह सुनिश्चित करें कि इसमें समान आयाम हैं)।
    • फ़ाइलों को बदलने के बाद, स्क्रिप्ट को डीएमजी कॉपी को फिर से अनमाउंट करें।
    • अंत में, लिखने योग्य, एक संपीड़ित करने के लिए (और इस तरह नहीं लिखने योग्य) DMG को परिवर्तित करने के लिए hdiutil को बुलाओ।

यह विधि इष्टतम नहीं लग सकती है, लेकिन मुझ पर भरोसा करें, यह वास्तव में अच्छी तरह से काम करता है। आप संस्करण नियंत्रण (जैसे SVN) के तहत भी मूल DMG (DMG टेम्प्लेट) डाल सकते हैं, इसलिए यदि आप कभी गलती से इसे बदल / नष्ट कर देते हैं, तो आप बस एक संशोधन पर वापस जा सकते हैं जहां यह अभी भी ठीक था। आप अपने Xcode प्रोजेक्ट में DMG टेम्पलेट को जोड़ सकते हैं, साथ में सभी अन्य फाइलें जो DMG (रीडमी, URL फाइल, बैकग्राउंड इमेज) पर हैं, सभी संस्करण नियंत्रण में हैं और फिर एक लक्ष्य बनाएं (जैसे "डीएमजी बनाएं" नाम का बाहरी लक्ष्य) और ऊपर की DMG स्क्रिप्ट चलाएं और अपने पुराने मुख्य लक्ष्य को आश्रित लक्ष्य के रूप में जोड़ें। आप स्क्रिप्ट में $ {SRCROOT} (हमेशा आपके उत्पाद का स्रोत रूट है) का उपयोग करके Xcode ट्री में फ़ाइलों को एक्सेस कर सकते हैं और आप $ {BUILT_PRODUCT_DIR} (हमेशा निर्देशिका का उपयोग करके निर्माण उत्पादों का उपयोग कर सकते हैं) ।

परिणाम: वास्तव में Xcode बिल्ड के अंत में DMG का उत्पादन कर सकता है। एक DMG जो जारी करने के लिए तैयार है। इतना ही नहीं आप इस तरह से एक डीएमजी को बहुत आसान बना सकते हैं, आप वास्तव में एक स्वचालित प्रक्रिया में कर सकते हैं (यदि आप चाहें तो एक हेडलेस सर्वर पर), कमांड लाइन से xcodebuild का उपयोग करते हुए (उदाहरण के लिए स्वचालित रूप से रात में बनाता है)।

टेम्प्लेट के प्रारंभिक लेआउट के संबंध में, फाइलस्टॉर्म इसे करने के लिए एक अच्छा उपकरण है। यह वाणिज्यिक है, लेकिन बहुत शक्तिशाली और उपयोग करने में आसान है। सामान्य संस्करण $ 20 से कम है, इसलिए यह वास्तव में सस्ती है। हो सकता है कि कोई व्यक्ति DMG बनाने के लिए FileStorm को स्वचालित कर सकता है (जैसे AppleScript के माध्यम से), कभी कोशिश नहीं की है, लेकिन एक बार जब आप सही टेम्पलेट DMG पा लेते हैं, तो इसे हर रिलीज़ के लिए अपडेट करना वास्तव में आसान होता है।


3
मैंने पहले ही कई कारणों से इसे इस तरह करने का विचार त्याग दिया है। यहां उनमें से दो हैं: उत्पाद के साथ इंस्टॉलरों की सामग्री अलग-अलग होगी, और हम केवल पैक मशीनों और स्क्रिप्ट पर स्थापित सॉफ़्टवेयर पर भरोसा करना चाहते हैं - नए उत्पादों को जोड़ने के लिए एक एकल, न्यूनतम, मैनुअल दिनचर्या।
लुडविग ए। नोरिन

यह वैसा ही परिदृश्य है जैसा हमारे पास है। हमारे पास एक दर्जन से अधिक उत्पाद हैं; प्रत्येक में एक पूरी तरह से अलग डीएमजी है। प्रति उत्पाद एक टेम्पलेट DMG बनाना केवल एक बार का काम है और आपको कुछ मिनटों का समय लगता है। और "इंस्टॉलर" से आपका क्या मतलब है? PKG / MPKG पैकेज स्थापित करें?
मैकी

यह एक ही परिदृश्य नहीं है। हम शॉर्ट नोटिस के साथ अक्सर उत्पादों को जोड़ते हैं। न्यूनतम मैनुअल रूटीन का मतलब है कि उत्पाद को एक नाम और कुछ अन्य विशेषताओं को देते हुए स्क्रिप्ट चलाना। इससे परे ऐसे कारण भी हैं जिनसे हमें इस तरह के समाधान का उपयोग न करने का निर्णय लेना पड़ा।
लुडविग ए। नोरिन

हमने निर्माण प्रक्रिया से पैक प्रक्रिया को अलग कर दिया है, क्योंकि यह अलग-अलग लोगों द्वारा अलग-अलग समय पर किया जाता है। पैक प्रक्रिया विंडोज, विंडोज सीई, सिम्बियन, एआईएक्स, लिनक्स और सोलारिस के लिए इंस्टॉलर बनाती है।
लुडविग ए। नोरिन

आप शायद hututil का उल्लेख कर रहे हैं, hdutil का नहीं।
इवान वूइका

25

इस उत्तर को प्रदान करके इस प्रश्न को अद्यतित करना।

appdmgएक सरल, आसानी से उपयोग होने वाला, ओपन-सोर्स कमांड लाइन प्रोग्राम है जो एक साधारण json विनिर्देशन से dmg-files बनाता है। आधिकारिक वेबसाइट पर रीडमी पर एक नज़र डालें:

https://github.com/LinusU/node-appdmg

त्वरित उदाहरण:

  1. Appdmg स्थापित करें

    npm install -g appdmg
    
  2. एक json फ़ाइल लिखें ( spec.json)

    {
      "title": "Test Title",
      "background": "background.png",
      "icon-size": 80,
      "contents": [
        { "x": 192, "y": 344, "type": "file", "path": "TestApp.app" },
        { "x": 448, "y": 344, "type": "link", "path": "/Applications" }
      ]
    }
    
  3. प्रोग्राम चलाओ

    appdmg spec.json test.dmg
    

(अस्वीकरण। मैं appdmg का निर्माता हूं)


3
सरल और प्रभावी। केवल नकारात्मक पक्ष यह है कि npm को स्थापित करने की आवश्यकता है
जैक जेम्स

@ क्रिएटर: क्या आप इसे एडवांस बना सकते हैं जैसे यह एक GUI को ड्रैग एंड ड्रॉप किए बिना? s.sudre.free.fr/Software/Packages/about.html

अगर .app फ़ाइल जोंस फ़ाइल के समान फ़ोल्डर में नहीं है, तो यह काम नहीं करता है, यह "फ़ाइल नहीं मिली" त्रुटि देता है जब आप "पथ" में एक रिश्तेदार पथ निर्दिष्ट करते हैं
जोय

@ जॉय, क्या आप जीथब रिपॉजिटरी पर एक मुद्दा खोल सकते हैं यदि यह आपके लिए काम नहीं करता है?
लिनस अननेबेक

@ जॉय: यह एक ही फोल्डर में होना जरूरी नहीं है, मेरे पास बैकग्राउंड है, सभी अलग-अलग रास्ते में हैं, बस रिश्तेदार रास्तों को पास करें जैसे ../../../ABC
अनूप वैद्य

22

आप में से जो लोग इस विषय में रुचि रखते हैं, उनके लिए मुझे उल्लेख करना चाहिए कि मैं डीएमजी कैसे बनाऊं:

hdiutil create XXX.dmg -volname "YYY" -fs HFS+ -srcfolder "ZZZ"

कहाँ पे

XXX == disk image file name (duh!)
YYY == window title displayed when DMG is opened
ZZZ == Path to a folder containing the files that will be copied into the DMG

1
यह ठीक है, लेकिन यह वास्तविक जरूरत (पृष्ठभूमि छवि, फ़ोल्डर में वस्तुओं की स्थिति आदि) को संबोधित नहीं करता है
टॉम बोगल

डीएमजी बनाया गया है, लेकिन फिर से मुझे सीएमडी का उपयोग करके अपनी स्क्रिप्ट (.sh) को चलाना है, डीएमजी बनाने के बाद मुझे स्वचालित रूप से श को चलाने की जरूरत है
सैंटोस

13

मेरा ऐप, ड्रॉपडैम , पृष्ठभूमि चित्रों, आइकन लेआउट, कस्टम वॉल्यूम आइकन और सॉफ़्टवेयर लाइसेंस समझौतों के साथ डिस्क चित्र बनाने का एक आसान तरीका है। इसे "ड्रॉपडैम" कमांड-लाइन टूल या AppleScript के माध्यम से एक बिल्ड सिस्टम से नियंत्रित किया जा सकता है। यदि वांछित है, तो चित्र और लाइसेंस आरटीएफ फाइलें आपके संस्करण नियंत्रण प्रणाली के तहत संग्रहीत की जा सकती हैं।


3
मेरी टीम के पास यह काम खूबसूरती से और स्वचालित रूप से जेनकिंस सीआई बिल्ड सर्वर पर है, जो पृष्ठभूमि के साथ पूरा होता है, एप्लिकेशन उपनाम पर खींचें। डिस्क चित्र बनाने के लिए ड्रॉपडीएमजी पर न चलें, न चलें।
पॉल कॉलिन्स

अच्छा अनुप्रयोग, मैं अपने परीक्षण की समय सीमा समाप्त होने के बाद इसे खरीदने जा रहा हूं।
किलिका 52

अच्छा लग रहा है, लेकिन यह खिड़की का आकार बदलने के लिए विकल्प नहीं लगता है।
avi

@avi DropDMG स्वचालित रूप से आपके द्वारा सेट की गई पृष्ठभूमि चित्र को विंडो को आकार देता है (या यदि वांछित है तो उस चित्र में इनसेट करें )।
माइकल Tsai

बहुत धन्यवाद! क्या पृष्ठभूमि की छवि के बिना आकार बदलना संभव है?
avi

6

इस प्रक्रिया को स्वचालित करने के लिए मुझे यह शानदार मैक ऐप मिला - http://www.araelium.com/dmgcanvas/ अगर आपके मैक ऐप के लिए dmg इंस्टॉलर बना रहे हैं तो आपको एक नज़र रखना चाहिए


1
ध्यान दें कि यह एक मुफ्त कार्यक्रम नहीं है, इसलिए यह कई वातावरणों के लिए उपयुक्त नहीं है।
जे मेनार्ड K5ZC

5

एक अच्छी दिखने वाली डीएमजी बनाने के लिए, अब आप कुछ अच्छे लिखित स्रोतों का उपयोग कर सकते हैं:


हो सकता है कि उन्होंने इसे स्थानांतरित किया हो। आप create-dmg और node-appdmg का उपयोग कर सकते हैं। मैं create-dmg का उपयोग कर रहा हूँ। यह अच्छा है।
आनी एस

@ पामेला कूक-लाइटबीकॉर्प यदि आप अभी भी रुचि रखते हैं। Dmgbuild का लिंक ठीक कर दिया गया है।
उप-

4

यदि आप कस्टम वॉल्यूम आइकन सेट करना चाहते हैं तो नीचे कमांड का उपयोग करें

/*Add a drive icon*/
cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"  


/*SetFile -c icnC will change the creator of the file to icnC*/
SetFile -c icnC /<your path>/.VolumeIcon.icns

अब dmg पढ़ें / लिखें

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName

क्या आप बता सकते हैं कि "आपका रास्ता" का क्या मतलब है? क्या मैं डिस्क पर किसी भी आइकन फ़ाइल का उपयोग कर सकता हूं, और SetFile इसे कॉपी करेगा, या मुझे एक फ़ाइल का उपयोग करने की आवश्यकता होगी जो .dmg के अंदर है। मेरे पास केवल एक मैक है, इसलिए यह परीक्षण करना कठिन है कि क्या सामान अन्य मशीनों पर काम करेगा।
मिलान बाबूसकोव

"आपका रास्ता" DMG नाम है। (/ वॉल्यूम / dmgName)
पराग बाफना

आपको icns फाइल कॉपी करना चाहिए। cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
पराग बाफना

4

मुझे आखिरकार अपने ही प्रोजेक्ट में काम मिल गया (जो कि Xcode में होता है)। अपने निर्माण चरण में इन 3 लिपियों को जोड़ने से आपके उत्पाद के लिए एक डिस्क छवि बन जाएगी जो अच्छी और साफ है। आपको केवल अपनी परियोजना का निर्माण करना है और DMG आपके उत्पादों के फ़ोल्डर में प्रतीक्षा कर रहा है।

स्क्रिप्ट 1 (अस्थायी डिस्क छवि बनाएं):

#!/bin/bash
#Create a R/W DMG

dir="$TEMP_FILES_DIR/disk"
dmg="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg"

rm -rf "$dir"
mkdir "$dir"
cp -R "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app" "$dir"
ln -s "/Applications" "$dir/Applications"
mkdir "$dir/.background"
cp "$PROJECT_DIR/$PROJECT_NAME/some_image.png" "$dir/.background"
rm -f "$dmg"
hdiutil create "$dmg" -srcfolder "$dir" -volname "$PRODUCT_NAME" -format UDRW

#Mount the disk image, and store the device name
hdiutil attach "$dmg" -noverify -noautoopen -readwrite

स्क्रिप्ट 2 (विंडो गुण सेट करें):

#!/usr/bin/osascript
#get the dimensions of the main window using a bash script

set {width, height, scale} to words of (do shell script "system_profiler SPDisplaysDataType | awk '/Main Display: Yes/{found=1} /Resolution/{width=$2; height=$4} /Retina/{scale=($2 == \"Yes\" ? 2 : 1)} /^ {8}[^ ]+/{if(found) {exit}; scale=1} END{printf \"%d %d %d\\n\", width, height, scale}'")
set x to ((width / 2) / scale)
set y to ((height / 2) / scale)

#get the product name using a bash script
set {product_name} to words of (do shell script "printf \"%s\", $PRODUCT_NAME")
set background to alias ("Volumes:"&product_name&":.background:some_image.png")

tell application "Finder"
    tell disk product_name
        open
        set current view of container window to icon view
        set toolbar visible of container window to false
        set statusbar visible of container window to false
        set the bounds of container window to {x, y, (x + 479), (y + 383)}
        set theViewOptions to the icon view options of container window
        set arrangement of theViewOptions to not arranged
        set icon size of theViewOptions to 128
        set background picture of theViewOptions to background
        set position of item (product_name & ".app") of container window to {100, 225}
        set position of item "Applications" of container window to {375, 225}
        update without registering applications
        close
    end tell
end tell

मेरी परियोजना के लिए खिड़की के काम के लिए उपरोक्त माप विशेष रूप से मेरी पृष्ठभूमि के आकार और आइकन रिज़ॉल्यूशन के कारण; आपको अपनी परियोजना के लिए इन मूल्यों को संशोधित करने की आवश्यकता हो सकती है।

स्क्रिप्ट 3 (फाइनल डिस्क इमेज स्क्रिप्ट बनाएं):

#!/bin/bash
dir="$TEMP_FILES_DIR/disk"
cp "$PROJECT_DIR/$PROJECT_NAME/some_other_image.png" "$dir/"

#unmount the temp image file, then convert it to final image file
sync
sync
hdiutil detach /Volumes/$PRODUCT_NAME
rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
hdiutil convert "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg"

#Change the icon of the image file
sips -i "$dir/some_other_image.png"
DeRez -only icns "$dir/some_other_image.png" > "$dir/tmpicns.rsrc"
Rez -append "$dir/tmpicns.rsrc" -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
SetFile -a C "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"

rm -rf "$dir"

सुनिश्चित करें कि आपके द्वारा उपयोग की जा रही छवि फ़ाइलें $ PROJECT_DIR / $ PROJECT_NAME / निर्देशिका में हैं!


यह मेरी परियोजना पर रिक्त डिस्क छवि बना रहा है। कोई उपाय।
मेनियाचैम्प

शेल स्क्रिप्ट का हिस्सा केवल काम करता है, लेकिन मैं बिल्ड स्क्रिप्ट में शेल स्क्रिप्ट के साथ Apple स्क्रिप्ट कैसे जोड़ सकता हूं बिल्ड फ़ेज़ के तहत यह त्रुटि दिखा रहा है, प्रत्येक ऐप्पल स्क्रिप्ट स्टेटमेंट का प्रतीक है जो नहीं मिला है।
मेनियाचेम्प

2

.DS_Store फ़ाइलें मैक में विंडोज़ सेटिंग्स को स्टोर करती हैं। विंडोज सेटिंग्स में आइकॉन लेआउट, विंडो बैकग्राउंड, विंडो का आकार आदि शामिल हैं। फाइल की व्यवस्था और विंडो बैकग्राउंड को सुरक्षित रखने के लिए माउंटेड इमेज के लिए विंडो बनाने के लिए .DS_Store फाइल की जरूरत होती है।

एक बार आपके पास .DS_Store फ़ाइल बन जाए, तो आप इसे केवल अपने बनाए इंस्टॉलर (DMG) में कॉपी कर सकते हैं।


लेकिन पहले dmg में बैकग्राउंड इमेज को कुछ इस तरह से नामांकित करके जोड़ें। बैकग्राउंड। Png और फिर बैकग्राउंड में उस (!) इमेज को जोड़ने के लिए Cmd-J का उपयोग करें।
गिज्स

2

मुझे पैकेजिंग और डीजीएम निर्माण करने के लिए कमांड लाइन दृष्टिकोण का उपयोग करने की भी आवश्यकता है "प्रोग्राम को स्क्रिप्ट में"। अब तक मुझे मिला सबसे अच्छा जवाब एडियम प्रोजेक्ट 'रिलीज बिल्डिंग फ्रेमवर्क (देखें आर 1) से है। आपको OSX WindowsServer GUI इंटरैक्शन से बचने की अनुमति देने के लिए एक कस्टम स्क्रिप्ट (AdiumApplescriptRunner) है। "osascript applescript.scpt" दृष्टिकोण आपको बिल्डर के रूप में लॉगिन करने और कमांड लाइन vV100 सत्र से dmg निर्माण चलाने की आवश्यकता है।

OSX पैकेज प्रबंधन प्रणाली अन्य यूनिक्स की तुलना में इतनी उन्नत नहीं है जो इस कार्य को आसानी से और व्यवस्थित रूप से कर सके।

R1: http://hg.adium.im/adium-1.4/file/00d944a3ef16/Release


2

मैंने ऐसा करने के लिए सिर्फ एक नई (मैत्रीपूर्ण) कमांड लाइन उपयोगिता लिखी है। यह खोजक / AppleScript, या किसी भी (पदावनत) उपनाम प्रबंधक API पर निर्भर नहीं करता है, और इसे कॉन्फ़िगर करना और उपयोग करना आसान है।

वैसे भी, जो कोई भी दिलचस्पी है वह इसे PyPi पर पा सकता है ; प्रलेखन रीड द डॉक्स पर उपलब्ध है


1

ये जवाब बहुत जटिल हैं और समय बदल गया है। निम्नलिखित 10.9 पर ठीक काम करता है, अनुमतियाँ सही हैं और यह अच्छा लग रहा है।

निर्देशिका से केवल पढ़ने के लिए DMG बनाएँ

#!/bin/sh
# create_dmg Frobulator Frobulator.dmg path/to/frobulator/dir [ 'Your Code Sign Identity' ]
set -e

VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
CODESIGN_IDENTITY="$4"

hdiutil create -srcfolder "$SRC_DIR" \
  -volname "$VOLNAME" \
  -fs HFS+ -fsargs "-c c=64,a=16,e=16" \
  -format UDZO -imagekey zlib-level=9 "$DMG"

if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

एक आइकन के साथ केवल-डीएमजी बनाएं (.icns प्रकार)

#!/bin/sh
# create_dmg_with_icon Frobulator Frobulator.dmg path/to/frobulator/dir path/to/someicon.icns [ 'Your Code Sign Identity' ]
set -e
VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
ICON_FILE="$4"
CODESIGN_IDENTITY="$5"

TMP_DMG="$(mktemp -u -t XXXXXXX)"
trap 'RESULT=$?; rm -f "$TMP_DMG"; exit $RESULT' INT QUIT TERM EXIT
hdiutil create -srcfolder "$SRC_DIR" -volname "$VOLNAME" -fs HFS+ \
               -fsargs "-c c=64,a=16,e=16" -format UDRW "$TMP_DMG"
TMP_DMG="${TMP_DMG}.dmg" # because OSX appends .dmg
DEVICE="$(hdiutil attach -readwrite -noautoopen "$TMP_DMG" | awk 'NR==1{print$1}')"
VOLUME="$(mount | grep "$DEVICE" | sed 's/^[^ ]* on //;s/ ([^)]*)$//')"
# start of DMG changes
cp "$ICON_FILE" "$VOLUME/.VolumeIcon.icns"
SetFile -c icnC "$VOLUME/.VolumeIcon.icns"
SetFile -a C "$VOLUME"
# end of DMG changes
hdiutil detach "$DEVICE"
hdiutil convert "$TMP_DMG" -format UDZO -imagekey zlib-level=9 -o "$DMG"
if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

अगर कुछ और होने की जरूरत है, तो ये सबसे आसान काम है SRC_DIR की एक अस्थायी प्रतिलिपि बनाना और DMG बनाने से पहले उसमें बदलाव लागू करना।


यह उत्तर कुछ भी नहीं जोड़ रहा है जो पहले लिखा गया है, और यह मूल प्रश्न का उत्तर भी नहीं देता है (यह सिर्फ डीजीएम में एक आइकन डालने के बारे में नहीं है, या इसे कैसे साइन इन करना है? सवाल ग्राफिक्स जोड़ने के बारे में है और आइकन को प्रोग्रामेटिक रूप से तैनात करना है। a dmg)।
लुडविग ए। नोरिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.