ฉันจะสร้าง DMG ที่ดูดีสำหรับ Mac OS X โดยใช้เครื่องมือบรรทัดคำสั่งได้อย่างไร


212

ฉันต้องสร้างตัวติดตั้งที่ดีสำหรับแอปพลิเคชัน Mac ฉันต้องการให้เป็นดิสก์อิมเมจ (DMG) ที่มีขนาดกำหนดไว้ล่วงหน้าเลย์เอาต์และรูปภาพพื้นหลัง

ฉันต้องทำสิ่งนี้โดยทางโปรแกรมในสคริปต์เพื่อรวมไว้ในระบบการสร้างที่มีอยู่ (ระบบแพ็คมากขึ้นจริงๆเพราะมันเพียงสร้างการติดตั้ง

ฉันสร้าง DMG เสร็จแล้วโดยใช้ "hdiutil" สิ่งที่ฉันยังไม่ทราบคือวิธีการจัดวางไอคอนและระบุบิตแมปพื้นหลัง


1
นี่ไม่ใช่สิ่งที่ถามแตกต่างกันใช่ไหม
Lenar Hoyt

คำตอบ:


199

หลังจากการค้นคว้ามากมายฉันได้คำตอบนี้และฉันขอใส่ไว้ที่นี่เป็นคำตอบสำหรับคำถามของฉันเองสำหรับการอ้างอิง:

  1. ตรวจสอบให้แน่ใจว่าได้เลือก "เปิดใช้งานการเข้าถึงอุปกรณ์ช่วยเหลือ" ในการตั้งค่าระบบ >> การเข้าถึงสากล มันเป็นสิ่งจำเป็นสำหรับ AppleScript ในการทำงาน คุณอาจต้องรีบูตหลังจากการเปลี่ยนแปลงนี้ (ไม่สามารถใช้งานได้เป็นอย่างอื่นใน Mac OS X Server 10.4)

  2. สร้าง DMG R / W มันจะต้องมีขนาดใหญ่กว่าผลที่ได้จะเป็น ในตัวอย่างนี้ตัวแปร bash "size" มีขนาดเป็น Kb และเนื้อหาของโฟลเดอร์ในตัวแปร bash "source" จะถูกคัดลอกไปยัง 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. จัดเก็บรูปภาพพื้นหลัง (ในรูปแบบ PNG) ในโฟลเดอร์ชื่อ ".background" ใน DMG และเก็บชื่อไว้ในตัวแปร "backgroundPictureName"

  5. ใช้ AppleScript เพื่อตั้งค่าสไตล์ภาพ (ชื่อของ. app ต้องอยู่ในตัวแปร bash "applicationName" ใช้ตัวแปรสำหรับคุณสมบัติอื่น ๆ ตามต้องการ):

    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. ทำให้ DMG เป็นรูปเป็นร่างโดยการตั้งค่าการอนุญาตอย่างถูกต้องบีบอัดและปล่อยมัน:

    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 
    

ใน Snow Leopard applescript ด้านบนจะไม่ตั้งตำแหน่งไอคอนอย่างถูกต้อง - ดูเหมือนว่าจะเป็น Snow Leopard bug วิธีหนึ่งในการแก้ปัญหาคือเพียงแค่เรียกปิด / เปิดหลังจากตั้งค่าไอคอนเช่น:

..
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ถึงสองครั้ง - เพราะอะไร
Konrad Rudolph

ฉันไม่พบวิธีใด ๆ ในการกำหนดรอคำสั่ง 'update โดยไม่ต้องลงทะเบียนแอปพลิเคชัน' ให้เสร็จสิ้น ฉันไม่แน่ใจว่าจำเป็นต้องนอนหลับหลังจาก "hdiutil แนบ" คุณจะต้องตรวจสอบเอกสาร (man hdiutil) การซิงค์ควรจะถูกเรียกเพียงครั้งเดียวฉันทำได้สองครั้งจากนิสัยเก่าตั้งแต่วัน SunOS ที่ดี
Ludvig A. Norin

1
อนุญาตให้แอปพลิเคชันจำลองการป้อนข้อมูลของเมาส์และคีย์บอร์ดและสิ่งอื่น ๆ
Ludvig A. Norin

1
หากสคริปต์หยุดทำงานจนกว่าจะหมดเวลาที่บรรทัด "อัปเดตโดยไม่ต้องลงทะเบียนแอปพลิเคชัน" แสดงว่าขั้นตอนที่ 1 ยังไม่เสร็จสมบูรณ์ (หรือเลิกทำแล้ว) ฉันเพิ่งพบสิ่งนี้ด้วยวิธีที่ยาก
Jay Maynard K5ZC

ฉันคิดว่าฉันพบข้อผิดพลาดเล็กน้อย - มีการดีดออกใน AppleScript ซึ่งทำก่อนที่คุณจะพยายามเรียกใช้ chmod chmod จะล้มเหลวเนื่องจากดิสก์ถูกดีดออกในขณะนี้
Trejkaz

56

มีสคริปต์ Bash เล็กน้อยที่เรียกว่าcreate-dmgที่สร้างDMGแฟนซีที่มีพื้นหลังที่กำหนดเองการวางตำแหน่งไอคอนที่กำหนดเองและชื่อไดรฟ์

ฉันได้สร้างมันเมื่อหลายปีก่อนสำหรับ บริษัท ที่ฉันวิ่งในเวลานั้น มันรอดชีวิตจากการมีส่วนร่วมของคนอื่นตั้งแต่นั้นมาและมีรายงานว่าทำงานได้ดี

นอกจากนี้ยังมีnode-appdmgซึ่งดูเหมือนจะเป็นความพยายามที่ทันสมัยและใช้งานมากขึ้นตาม Node.js; ตรวจสอบออกเช่นกัน


7
ลิงก์ไปยังสคริปต์ทุบตีของคุณใช้งานไม่ได้ คุณสามารถใส่มันลงในส่วนสำคัญใน github.com ได้หรือไม่? ขอบคุณ
dquimper

create-dmg วางตำแหน่งไอคอนไม่ดี หากคุณต้องการคุณสมบัตินี้อย่าใช้มัน
laike9m

1
@ laike9m นานกว่า 5 ปีแล้วที่ฉันได้สัมผัสมันครั้งสุดท้าย ฉันไม่คิดว่า DMGs เป็นวิธีที่ดีที่สุดในการเผยแพร่ซอฟต์แวร์ Mac อีกต่อไป ดังนั้นมันจึงรอดชีวิตจากการมีส่วนร่วมของผู้อื่น - หวังว่าจะมีใครบางคนคิดออกไอคอนด้วย
Andrey Tarantsov

3
@Zmey ในฐานะผู้ใช้ฉันชอบไฟล์ zip มากกว่า คะแนนโบนัสสำหรับการคัดลอกอัตโนมัติไป/Applicationsที่แอปนั้นตรวจพบว่าทำงาน~/Downloadsอยู่ ดูเพิ่มเติมบทความเก่านี้โดยจอห์นกรูเบอร์
Andrey Tarantsov


37

อย่าไปที่นั่น ในฐานะนักพัฒนา Mac ระยะยาวฉันรับรองได้เลยว่าไม่มีวิธีใดที่ทำงานได้ดี ฉันลองใช้วิธีแก้ปัญหามากมาย แต่ก็ไม่ได้ดีเกินไป ฉันคิดว่าปัญหาคือแอปเปิ้ลไม่ได้จัดทำเอกสารรูปแบบข้อมูลเมตาสำหรับข้อมูลที่จำเป็นจริงๆ

นี่คือวิธีที่ฉันทำมันมาเป็นเวลานานประสบความสำเร็จอย่างมาก:

  1. สร้าง DMG ใหม่เขียนได้ (!) ใหญ่พอที่จะเก็บไบนารีที่คาดหวังและไฟล์เพิ่มเติมเช่น readme (sparse อาจใช้งานได้)

  2. เมานต์ DMG และกำหนดเลย์เอาต์ด้วยตนเองใน Finder หรือด้วยเครื่องมืออะไรก็ตามที่เหมาะกับคุณสำหรับการทำเช่นนั้น (ดูลิงก์ FileStorm ที่ด้านล่างสำหรับเครื่องมือที่ดี) ภาพพื้นหลังมักจะเป็นภาพที่เราใส่ลงในโฟลเดอร์ที่ซ่อนอยู่ (".something") ใน DMG วางสำเนาแอพของคุณไว้ที่นี่ (ทุกเวอร์ชั่นแม้จะเป็นรุ่นเก่าก็ตาม) คัดลอกไฟล์อื่น ๆ (นามแฝง readme ฯลฯ ) ที่คุณต้องการอีกครั้งรุ่นที่ล้าสมัยจะทำได้ดี ตรวจสอบให้แน่ใจว่าไอคอนมีขนาดและตำแหน่งที่ถูกต้อง (IOW จัดวาง DMG ตามที่คุณต้องการ)

  3. ถอนติดตั้ง DMG อีกครั้งการตั้งค่าทั้งหมดควรเก็บไว้ในตอนนี้

  4. เขียนสคริปต์ DMG สร้างซึ่งทำงานดังนี้:

    • มันคัดลอก DMG ดังนั้นจึงไม่เคยมีใครสัมผัสต้นฉบับอีกเลย
    • มันติดสำเนา
    • มันจะแทนที่ไฟล์ทั้งหมดด้วยไฟล์ล่าสุด (เช่นแอพล่าสุดหลังจาก build) คุณสามารถใช้mvหรือdittoสำหรับคำสั่งนั้นได้ หมายเหตุเมื่อคุณแทนที่ไฟล์เช่นนั้นไอคอนจะยังคงเหมือนเดิมตำแหน่งจะยังคงเหมือนเดิมทุกอย่างยกเว้นเนื้อหาของไฟล์ (หรือไดเรกทอรี) จะยังคงเหมือนเดิม (อย่างน้อยกับ Ditto ซึ่งโดยปกติเราใช้สำหรับงานนั้น) . แน่นอนว่าคุณสามารถแทนที่ภาพพื้นหลังด้วยภาพอื่นได้ (ตรวจสอบให้แน่ใจว่ามีขนาดเดียวกัน)
    • หลังจากแทนที่ไฟล์แล้วให้สคริปต์เลิกเมานท์สำเนา DMG อีกครั้ง
    • ในที่สุดเรียก hdiutil เพื่อแปลงที่เขียนได้ไปเป็น DMG ที่ถูกบีบอัด (และไม่สามารถเขียนได้)

วิธีนี้อาจไม่ดีที่สุด แต่เชื่อใจฉันมันใช้งานได้ดีจริง ๆ ในทางปฏิบัติ คุณสามารถวาง DMG ดั้งเดิม (เทมเพลต DMG) ได้แม้อยู่ภายใต้การควบคุมเวอร์ชัน (เช่น SVN) ดังนั้นหากคุณเปลี่ยนหรือทำลายโดยไม่ตั้งใจคุณสามารถย้อนกลับไปที่การแก้ไขที่ยังไม่เป็นไร คุณสามารถเพิ่มเทมเพลต DMG ในโครงการ Xcode ของคุณพร้อมกับไฟล์อื่น ๆ ทั้งหมดที่เป็นของ DMG (readme, ไฟล์ URL, ภาพพื้นหลัง), ทั้งหมดภายใต้การควบคุมเวอร์ชันแล้วสร้างเป้าหมาย (เช่นเป้าหมายภายนอกชื่อ "สร้าง DMG") และเรียกใช้สคริปต์ DMG ด้านบนและเพิ่มเป้าหมายหลักเก่าของคุณเป็นเป้าหมายที่ต้องพึ่งพา คุณสามารถเข้าถึงไฟล์ในแผนผัง Xcode โดยใช้ $ {SRCROOT} ในสคริปต์ (เป็นรากที่มาของผลิตภัณฑ์ของคุณเสมอ) และคุณสามารถเข้าถึงผลิตภัณฑ์บิลด์ได้โดยใช้ $ {BUILT_PRODUCTS_DIR} (เป็นไดเรกทอรีที่ Xcode สร้างผลลัพธ์แบบบิลด์เสมอ) .

ผลลัพธ์: จริง ๆ Xcode สามารถสร้าง DMG ได้ที่ส่วนท้ายของบิลด์ DMG ที่พร้อมเผยแพร่ ไม่เพียง แต่คุณสามารถสร้าง DMG relase ได้อย่างง่ายดาย แต่คุณสามารถทำได้ในกระบวนการอัตโนมัติ (บนเซิร์ฟเวอร์ที่ไม่มีหัวหากคุณต้องการ) โดยใช้ xcodebuild จากบรรทัดคำสั่ง (สร้างอัตโนมัติทุกคืน)

เกี่ยวกับเค้าโครงเริ่มต้นของแม่แบบFileStormเป็นเครื่องมือที่ดีสำหรับการทำมัน มันเป็นเชิงพาณิชย์ แต่มีประสิทธิภาพมากและใช้งานง่าย รุ่นปกติน้อยกว่า $ 20 ดังนั้นมันจึงมีราคาไม่แพงจริงๆ อาจเป็นไปได้ที่ FileStorm จะสร้าง DMG (เช่นผ่าน AppleScript) โดยอัตโนมัติไม่เคยลองทำ แต่เมื่อคุณพบเทมเพลต DMG ที่สมบูรณ์แบบแล้วมันง่ายมากที่จะอัปเดตสำหรับทุกรุ่น


3
ฉันได้ละทิ้งแนวคิดที่จะทำเช่นนี้ด้วยเหตุผลหลายประการ ต่อไปนี้เป็นสองรายการ: เนื้อหาของตัวติดตั้งจะแตกต่างกันไปตามผลิตภัณฑ์และเราต้องการพึ่งพาซอฟต์แวร์ที่ติดตั้งในเครื่องแพ็คและสคริปต์ซึ่งเป็นขั้นตอนเดียวขั้นต่ำที่กำหนดเองสำหรับการเพิ่มผลิตภัณฑ์ใหม่
Ludvig A. Norin

นี่เป็นสถานการณ์เดียวกับที่เรามี เรามีผลิตภัณฑ์มากกว่าหนึ่งโหล แต่ละคนมี DMG ที่แตกต่างกันอย่างสิ้นเชิง การสร้างเทมเพลตหนึ่งรายการ DMG ต่อผลิตภัณฑ์นั้นเป็นงานเพียงครั้งเดียวและใช้เวลาไม่กี่นาที และคุณหมายถึงอะไรโดย "ตัวติดตั้ง"? แพ็คเกจการติดตั้ง PKG / MPKG?
Mecki

มันไม่ใช่สถานการณ์เดียวกัน เราเพิ่มผลิตภัณฑ์บ่อยครั้งโดยมีการแจ้งเตือนสั้น ๆ รูทีนแบบแมนนวลขั้นต่ำหมายถึงการเรียกใช้สคริปต์เพื่อให้ชื่อผลิตภัณฑ์และคุณลักษณะอื่น ๆ มีเหตุผลเกินกว่านี้เช่นกันที่ทำให้เราตัดสินใจไม่ใช้วิธีการแก้ปัญหาแบบนั้น
Ludvig A. Norin

เราได้แยกกระบวนการแพ็คออกจากกระบวนการสร้างเนื่องจากทำโดยคนต่างเวลากัน กระบวนการบรรจุสร้างตัวติดตั้งสำหรับ Windows, Windows CE, Symbian, AIX, Linux และ Solaris เช่นกัน
Ludvig A. Norin

คุณอาจหมายถึง hdiutil ไม่ใช่ hdutil
Ivan Vučica

25

ทำให้คำถามนี้เป็นปัจจุบันโดยการให้คำตอบนี้

appdmgเป็นโปรแกรมบรรทัดคำสั่งแบบโอเพนซอร์สที่ใช้งานง่ายและใช้งานง่ายที่สร้างไฟล์ dmg จากข้อกำหนด json แบบง่าย ดู readme ที่เว็บไซต์อย่างเป็นทางการ:

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

@Creator: คุณช่วยทำให้มันก้าวหน้าได้เช่นเดียวกับ GUI นี้โดยไม่ต้องลากแล้วปล่อย? s.sudre.free.fr/Software/Packages/about.html

หากไฟล์. app ไม่อยู่ในโฟลเดอร์เดียวกับไฟล์ json สิ่งนี้จะไม่ทำงานมันจะแสดงข้อผิดพลาด "ไม่พบไฟล์" เมื่อคุณระบุเส้นทางสัมพัทธ์ใน "path"
Joey

@ โจอี้คุณช่วยเปิดปัญหาในที่เก็บ Github ได้ไหมถ้ามันไม่เหมาะกับคุณ?
Linus Unnebäck

@ โจอี้: มันไม่จำเป็นต้องอยู่ในโฟลเดอร์เดียวกันฉันมีพื้นหลังแอพทั้งหมดในเส้นทางที่แตกต่างเพียงแค่ผ่านเส้นทางสัมพัทธ์เป็น
Anoop Vaidya

22

สำหรับบรรดาของคุณที่มีความสนใจในหัวข้อนี้ฉันควรพูดถึงว่าฉันสร้าง DMG:

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
ไม่เป็นไร แต่ไม่ได้ตอบสนองความต้องการที่แท้จริง (ภาพพื้นหลัง, การวางตำแหน่งของรายการในโฟลเดอร์ ฯลฯ )
Tom Bogle

สร้าง DMG แล้ว แต่ฉันต้องเรียกใช้สคริปต์ (.sh) อีกครั้งโดยใช้ CMD ฉันต้องเรียกใช้ sh โดยอัตโนมัติหลังจากสร้าง DMG
SANTOSH

13

แอปของฉันDropDMGเป็นวิธีที่ง่ายในการสร้างภาพดิสก์ที่มีภาพพื้นหลังเค้าโครงไอคอนไอคอนไดรฟ์ข้อมูลแบบกำหนดเองและข้อตกลงสิทธิ์การใช้งานซอฟต์แวร์ สามารถควบคุมได้จากระบบบิลด์ผ่านเครื่องมือบรรทัดคำสั่ง "dropdmg" หรือ AppleScript หากต้องการไฟล์ RTF ของรูปภาพและใบอนุญาตสามารถจัดเก็บได้ภายใต้ระบบควบคุมเวอร์ชันของคุณ


3
ทีมของฉันทำงานได้อย่างสวยงามและอัตโนมัติบน Jenkins CI build server พร้อมพื้นหลังลากไปที่ Applications alias เรียกใช้อย่าเดินไปที่ DropDMG เพื่อสร้างภาพดิสก์
พอลคอลลิน

แอพที่ดีฉันจะซื้อหลังจากทดลองใช้หมด
kilik52

ดูดี แต่ดูเหมือนจะไม่มีตัวเลือกในการปรับขนาดหน้าต่าง
avi

@avi DropDMG ปรับขนาดหน้าต่างเป็นภาพพื้นหลังที่คุณตั้งไว้โดยอัตโนมัติ (หรือแทรกเข้าไปในรูปภาพนั้นหากต้องการ)
Michael Tsai

เยี่ยมมากขอบคุณ! เป็นไปได้ไหมที่จะปรับขนาดโดยไม่มีภาพพื้นหลัง?
avi

6

ฉันพบแอพ mac ที่ยอดเยี่ยมนี้เพื่อทำให้กระบวนการอัตโนมัติ - http://www.araelium.com/dmgcanvas/ คุณต้องดูว่าคุณกำลังสร้างตัวติดตั้ง dmg สำหรับแอป mac ของคุณหรือไม่


1
โปรดทราบว่านี่ไม่ใช่โปรแกรมฟรีดังนั้นจึงไม่เหมาะกับสภาพแวดล้อมหลาย ๆ อย่าง
Jay Maynard K5ZC

5

สำหรับการสร้าง DMG ที่ดูดีตอนนี้คุณสามารถใช้โอเพนซอร์สที่เขียนได้ดี:


พวกเขาอาจจะย้ายมัน คุณสามารถใช้ create-dmg และ node-appdmg ฉันใช้ create-dmg ดี.
Anni S

@ PamelaCook-LightBeCorp ในกรณีที่คุณยังสนใจ ลิงก์ไปยัง dmgbuild ได้รับการแก้ไขแล้ว
SubOptimal

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 ฉันมีเครื่อง Mac เพียงเครื่องเดียวดังนั้นจึงเป็นการยากที่จะทดสอบว่าสิ่งต่าง ๆ จะใช้ได้กับเครื่องอื่นหรือไม่
Milan Babuškov

"your path" เป็นชื่อ DMG (/ เล่ม / dmgName)
Parag Bafna

คุณควรคัดลอกไฟล์ icns cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
Parag Bafna

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


มันกำลังสร้างภาพดิสก์เปล่าในโครงการของฉัน ข้อเสนอแนะใด ๆ
ManiaChamp

ส่วนเชลล์สคริปต์ใช้งานได้เท่านั้น แต่ฉันจะเพิ่ม Apple script ด้วย Shell Script ใน RunScript ภายใต้ Build Phase ได้อย่างไรแสดงข้อผิดพลาดคำสั่ง apple script ทั้งหมดไม่พบสัญลักษณ์
ManiaChamp

2

.DS_Store ไฟล์เก็บการตั้งค่า windows ใน Mac การตั้งค่า Windows ประกอบด้วยรูปแบบไอคอนพื้นหลังหน้าต่างขนาดของหน้าต่างเป็นต้นจำเป็นต้องใช้ไฟล์. DS_Store ในการสร้างหน้าต่างสำหรับรูปภาพที่ประกอบเข้าด้วยกันเพื่อรักษาการจัดเรียงของไฟล์และพื้นหลังของหน้าต่าง

เมื่อคุณสร้างไฟล์. DS_Store แล้วคุณสามารถคัดลอกไฟล์ไปยังตัวติดตั้งที่สร้างขึ้น (DMG)


แต่ก่อนเพิ่มภาพพื้นหลังเพื่อ dmg โดยการตั้งชื่อมันเช่น. background.png แล้วใช้ Cmd-J เพื่อเพิ่มภาพ (!) ที่พื้นหลัง
Gijs

2

ฉันยังต้องการใช้วิธีบรรทัดคำสั่งในการทำบรรจุภัณฑ์และสร้าง dmg "โดยทางโปรแกรมในสคริปต์" คำตอบที่ดีที่สุดที่ฉันพบคือจากกรอบการสร้าง Release project (ดู R1) มีสคริปต์ที่กำหนดเอง (AdiumApplescriptRunner) เพื่อให้คุณหลีกเลี่ยงการโต้ตอบกับ OSX WindowsServer GUI วิธีการ "osascript applescript.scpt" ทำให้คุณต้องลงชื่อเข้าใช้ในฐานะผู้สร้างและเรียกใช้การสร้าง dmg จากเซสชันบรรทัดคำสั่ง vt100

ระบบการจัดการแพคเกจ OSX นั้นไม่ได้ก้าวหน้าไปมากเมื่อเทียบกับ Unixen อื่น ๆ ซึ่งสามารถทำงานนี้ได้อย่างง่ายดายและเป็นระบบ

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


2

ฉันเพิ่งเขียนอรรถประโยชน์บรรทัดคำสั่งใหม่ (เป็นมิตร) เพื่อทำสิ่งนี้ ไม่ต้องอาศัย Finder / AppleScript หรือ API ตัวจัดการชื่อแทน (คัดค้าน) APIs ใด ๆ และง่ายต่อการกำหนดค่าและใช้งาน

อย่างไรก็ตามทุกคนที่สนใจสามารถพบได้ใน 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

สร้าง DMG แบบอ่านอย่างเดียวพร้อมไอคอน (ประเภท. 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


คำตอบนี้ไม่ได้เพิ่มสิ่งใด ๆ ที่เขียนไว้ก่อนหน้านี้และยังไม่ตอบคำถามเดิม (ไม่ใช่เพียงแค่วางไอคอนใน dmg หรือวิธีการเซ็นชื่อคำถามคือเกี่ยวกับการเพิ่มกราฟิกและไอคอนตำแหน่งโดยทางโปรแกรม a dmg)
ลุดวิกเอโนริน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.