Làm cách nào để tạo DMG đẹp mắt cho Mac OS X bằng các công cụ dòng lệnh?


212

Tôi cần tạo một trình cài đặt đẹp cho ứng dụng Mac. Tôi muốn nó là một hình ảnh đĩa (DMG), với kích thước, bố cục và hình nền được xác định trước.

Tôi cần phải thực hiện việc này theo chương trình trong một kịch bản, để được tích hợp trong một hệ thống xây dựng hiện có (thực sự nhiều hơn một hệ thống gói, vì nó chỉ tạo các trình cài đặt. Các bản dựng được thực hiện riêng).

Tôi đã tạo xong DMG bằng cách sử dụng "hdiutil", điều tôi chưa tìm ra là làm thế nào để tạo bố cục biểu tượng và chỉ định bitmap nền.


1
Đây không phải là một cái gì đó cho Hỏi khác nhau sao?
Lenar Hoyt

Câu trả lời:


199

Sau rất nhiều nghiên cứu, tôi đã đưa ra câu trả lời này và tôi sẽ đặt nó ở đây như một câu trả lời cho câu hỏi của riêng tôi, để tham khảo:

  1. Đảm bảo rằng "Bật quyền truy cập cho các thiết bị trợ giúp" được chọn trong Tùy chọn hệ thống >> Truy cập toàn cầu. Nó là cần thiết để AppleScript hoạt động. Bạn có thể phải khởi động lại sau khi thay đổi này (nó không hoạt động khác trên Mac OS X Server 10.4).

  2. Tạo R / W DMG. Nó phải lớn hơn kết quả sẽ được. Trong ví dụ này, biến bash "size" chứa kích thước tính bằng Kb và nội dung của thư mục trong biến bash "nguồn" sẽ được sao chép vào 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. Gắn hình ảnh đĩa và lưu trữ tên thiết bị (bạn có thể muốn sử dụng chế độ ngủ trong vài giây sau thao tác này):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Lưu trữ ảnh nền (ở định dạng PNG) trong thư mục có tên ".background" trong DMG và lưu tên của nó trong biến "backgroundPictureName".

  5. Sử dụng AppleScript để đặt kiểu trực quan (tên của .app phải nằm trong biến bash "applicationName", sử dụng biến cho các thuộc tính khác nếu cần):

    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. Hoàn thiện DMG bằng cách đặt quyền, nén và giải phóng nó:

    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 
    

Trên Snow Leopard, applescript ở trên sẽ không đặt đúng vị trí biểu tượng - có vẻ như đó là lỗi Snow Leopard. Một cách giải quyết khác là chỉ cần gọi đóng / mở sau khi đặt biểu tượng, nghĩa là:

..
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
Thông minh. Hai câu hỏi về điều đó: 1. Bạn đề nghị sleepsau khi ghép hình ảnh. Bao lâu? Không thể xác định chờ đợi để hoàn thành quá trình? Tương tự như vậy delay 5trong AppleScript của bạn. Tôi luôn cảnh giác với những khoảng thời gian chờ đợi tùy tiện như vậy, đã có một số trải nghiệm rất tồi tệ với họ. 2. Trong bước 6 của bạn, bạn gọi synchai lần - tại sao?
Konrad Rudolph

Tôi chưa tìm thấy cách nào để chờ đợi hoàn thành lệnh 'cập nhật mà không đăng ký ứng dụng'. Tôi không chắc chắn giấc ngủ là cần thiết sau khi "hdiutil đính kèm", bạn sẽ phải kiểm tra tài liệu (man hdiutil). Đồng bộ hóa chỉ cần được gọi một lần, tôi thực hiện hai lần theo thói quen cũ kể từ những ngày SunOS cũ.
Ludvig A. Norin

1
Nó cho phép applescript mô phỏng đầu vào chuột và bàn phím và một loạt những thứ khác.
Ludvig A. Norin

1
Nếu tập lệnh bị treo cho đến khi hết thời gian tại dòng "cập nhật mà không đăng ký ứng dụng", thì bước 1 đã không được thực hiện (hoặc đã hoàn tác). Tôi chỉ tìm thấy điều này một cách khó khăn.
Jay Maynard K5ZC

Tôi nghĩ rằng tôi đã tìm thấy một trục trặc nhỏ - có một đẩy ra trong AppleScript, được thực hiện trước khi bạn cố chạy chmod. chmod sẽ thất bại vì đĩa đã bị đẩy ra.
Trejkaz

56

Có một đoạn script Bash nhỏ gọi là create-dmg , xây dựng các DMG ưa thích với nền tùy chỉnh, định vị biểu tượng tùy chỉnh và tên âm lượng.

Tôi đã xây dựng nó nhiều năm trước cho công ty mà tôi điều hành vào thời điểm đó; nó tồn tại nhờ sự đóng góp của người khác kể từ đó, và được báo cáo là hoạt động tốt.

Ngoài ra còn có nút-appdmg trông giống như một nỗ lực hiện đại và tích cực hơn dựa trên Node.js; kiểm tra nó là tốt.


7
Liên kết đến tập lệnh bash của bạn bị hỏng. Bạn có thể đặt nó trong một ý chính trên github.com không? Cảm ơn
dquimper

tạo-dmg KHÔNG định vị biểu tượng tốt. Nếu bạn cần tính năng này, đừng sử dụng nó.
laike9m

1
@ laike9m Đã hơn 5 năm kể từ lần cuối tôi chạm vào nó. Tôi thực sự không coi DMG là cách tốt nhất để phân phối phần mềm Mac nữa. Vì vậy, nó tồn tại trên sự đóng góp của người khác - hy vọng ai đó cũng sẽ tìm ra vấn đề biểu tượng.
Andrey Tarantsov

3
@Zmey Là một người dùng, tôi thích các tệp zip hơn. Điểm thưởng cho tự động sao chép /Applicationsnếu ứng dụng phát hiện ra nó đang chạy ~/Downloads. Xem thêm bài viết cũ này của John Gruber .
Andrey Tarantsov


37

Đừng đến đó. Là một nhà phát triển Mac dài hạn, tôi có thể đảm bảo với bạn, không có giải pháp nào thực sự hoạt động tốt. Tôi đã thử rất nhiều giải pháp, nhưng tất cả đều không quá tốt. Tôi nghĩ vấn đề là Apple không thực sự ghi lại định dạng dữ liệu meta cho dữ liệu cần thiết.

Đây là cách tôi làm trong một thời gian dài, rất thành công:

  1. Tạo một DMG mới, có thể ghi (!), Đủ lớn để chứa tệp nhị phân và tệp bổ sung dự kiến ​​như readme (thưa thớt có thể hoạt động).

  2. Gắn DMG và bố trí thủ công trong Finder hoặc với bất kỳ công cụ nào phù hợp với bạn để làm điều đó (xem liên kết FileStorm ở phía dưới để biết công cụ tốt). Hình nền thường là hình ảnh chúng tôi đặt vào một thư mục ẩn (".s Something") trên DMG. Đặt một bản sao của ứng dụng của bạn ở đó (bất kỳ phiên bản nào, thậm chí là lỗi thời sẽ làm). Sao chép các tệp khác (bí danh, readme, v.v.) bạn muốn ở đó, một lần nữa, các phiên bản lỗi thời sẽ làm tốt. Đảm bảo các biểu tượng có kích thước và vị trí phù hợp (IOW, bố trí DMG theo cách bạn muốn).

  3. Ngắt kết nối DMG một lần nữa, tất cả các cài đặt sẽ được lưu trữ ngay bây giờ.

  4. Viết tập lệnh tạo DMG, hoạt động như sau:

    • Nó sao chép DMG, vì vậy bản gốc không bao giờ được chạm lại.
    • Nó gắn kết bản sao.
    • Nó thay thế tất cả các tệp bằng những tệp cập nhật nhất (ví dụ: ứng dụng mới nhất sau khi xây dựng). Bạn chỉ có thể sử dụng mv hoặc ditto cho dòng lệnh đó. Lưu ý, khi bạn thay thế một tệp như vậy, biểu tượng sẽ giữ nguyên, vị trí sẽ giữ nguyên, mọi thứ trừ nội dung tệp (hoặc thư mục) vẫn giữ nguyên (ít nhất là với ditto, mà chúng ta thường sử dụng cho tác vụ đó) . Tất nhiên bạn cũng có thể thay thế hình nền bằng một hình khác (chỉ cần đảm bảo rằng nó có cùng kích thước).
    • Sau khi thay thế các tệp, làm cho tập lệnh ngắt kết nối bản sao DMG một lần nữa.
    • Cuối cùng gọi hdiutil để chuyển đổi DMG có thể ghi, thành DMG nén (và không thể ghi).

Phương pháp này nghe có vẻ không tối ưu, nhưng tin tôi đi, nó hoạt động thực sự tốt trong thực tế. Bạn có thể đặt DMG gốc (mẫu DMG) ngay cả dưới sự kiểm soát phiên bản (ví dụ SVN), vì vậy nếu bạn vô tình thay đổi / phá hủy nó, bạn có thể quay lại bản sửa đổi mà vẫn ổn. Bạn có thể thêm mẫu DMG vào dự án Xcode của mình, cùng với tất cả các tệp khác thuộc về DMG (readme, tệp URL, hình nền), tất cả dưới sự kiểm soát phiên bản và sau đó tạo mục tiêu (ví dụ: mục tiêu bên ngoài có tên "Tạo DMG") và ở đó chạy tập lệnh DMG ở trên và thêm mục tiêu chính cũ của bạn làm mục tiêu phụ thuộc. Bạn có thể truy cập các tệp trong cây Xcode bằng $ {SRCROOT} trong tập lệnh (luôn là gốc nguồn của sản phẩm của bạn) và bạn có thể truy cập các sản phẩm xây dựng bằng cách sử dụng $ {BUILT_PRODUCTS_DIR} (luôn là thư mục nơi Xcode tạo kết quả bản dựng) .

Kết quả: Trên thực tế Xcode có thể tạo DMG khi kết thúc quá trình xây dựng. Một DMG đã sẵn sàng để phát hành. Bằng cách đó, bạn không chỉ có thể tạo DMG theo đuổi khá dễ dàng, mà thực tế bạn có thể làm như vậy trong quy trình tự động (trên máy chủ không đầu nếu bạn muốn), sử dụng xcodebuild từ dòng lệnh (ví dụ: xây dựng hàng đêm tự động).

Về bố cục ban đầu của mẫu, FileStorm là một công cụ tốt để thực hiện. Nó là thương mại, nhưng rất mạnh mẽ và dễ sử dụng. Phiên bản bình thường có giá dưới 20 đô la, vì vậy nó thực sự có giá phải chăng. Có thể người ta có thể tự động hóa FileStorm để tạo DMG (ví dụ thông qua AppleScript), nhưng chưa bao giờ thử điều đó, nhưng một khi bạn đã tìm thấy mẫu DMG hoàn hảo, thật dễ dàng để cập nhật nó cho mỗi bản phát hành.


3
Tôi đã loại bỏ ý tưởng làm theo cách này, vì nhiều lý do. Đây là hai trong số đó: nội dung của các trình cài đặt sẽ thay đổi theo sản phẩm và chúng tôi chỉ muốn dựa vào phần mềm được cài đặt trên máy đóng gói và tập lệnh - một thói quen thủ công, tối thiểu để thêm sản phẩm mới.
Ludvig A. Norin

Đây là kịch bản tương tự như chúng ta có. Chúng tôi có hơn một tá sản phẩm; mỗi loại có một DMG hoàn toàn khác nhau. Tạo một mẫu DMG cho mỗi sản phẩm là nhiệm vụ duy nhất một lần và bạn sẽ mất vài phút. Và ý nghĩa của "trình cài đặt" là gì? Gói cài đặt PKG / MPKG?
Mecki

Đó không phải là cùng một kịch bản. Chúng tôi thêm sản phẩm thường xuyên, với thông báo ngắn. Thói quen thủ công tối thiểu có nghĩa là chạy tập lệnh đặt tên cho sản phẩm và một vài thuộc tính khác. Có nhiều lý do ngoài điều này cũng khiến chúng tôi đưa ra quyết định không sử dụng loại giải pháp đó.
Ludvig A. Norin

Chúng tôi đã tách quy trình đóng gói khỏi quy trình xây dựng, bởi vì nó được thực hiện bởi những người khác nhau vào các thời điểm khác nhau. Quá trình gói tạo ra các trình cài đặt cho Windows, Windows CE, Symbian, AIX, Linux và Solaris.
Ludvig A. Norin

Bạn có thể đang đề cập đến hdiutil, không phải hdutil.
Ivan Vučica

25

Đưa câu hỏi này đến nay bằng cách cung cấp câu trả lời này.

appdmglà một chương trình dòng lệnh nguồn mở đơn giản, dễ sử dụng, tạo các tệp dmg từ một đặc tả json đơn giản. Hãy xem readme tại trang web chính thức:

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

Ví dụ nhanh:

  1. Cài đặt appdmg

    npm install -g appdmg
    
  2. Viết một tệp 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. Chạy chương trình

    appdmg spec.json test.dmg
    

(từ chối trách nhiệm. Tôi là người tạo ra appdmg)


3
đơn giản và hiệu quả. Nhược điểm duy nhất là nó yêu cầu cài đặt npm
Jack James

@Creator: bạn có thể vui lòng nâng cấp nó như GUI này mà không cần phải kéo và thả không? s.sudre.free.fr/Software/Packages/about.html

Nếu tệp .app không nằm trong cùng thư mục với tệp json, thì tệp này không hoạt động, nó sẽ báo lỗi "không tìm thấy tệp" khi bạn chỉ định đường dẫn tương đối trong "đường dẫn"
Joey

@Joey, bạn có thể mở một vấn đề trên kho Github nếu nó không hoạt động với bạn?
Linus Unnebäck

@Joey: Không bắt buộc phải ở trong cùng một thư mục, tôi có nền, ứng dụng tất cả trong các đường dẫn khác nhau, chỉ cần vượt qua các đường dẫn tương đối là ../../../ABC
Anoop Vaidya

22

Đối với những bạn quan tâm đến chủ đề này, tôi nên đề cập đến cách tôi tạo DMG:

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

Ở đâu

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
Điều đó tốt, nhưng nó không giải quyết được nhu cầu thực tế (ảnh nền, định vị các mục trong thư mục, v.v.)
Tom Bogle

đã tạo DMG nhưng một lần nữa tôi phải chạy Script (.sh) bằng CMD, tôi cần nó tự động chạy sh sau khi tạo DMG
SANTOSH

13

Ứng dụng của tôi, DropDMG , là một cách dễ dàng để tạo hình ảnh đĩa với hình nền, bố cục biểu tượng, biểu tượng âm lượng tùy chỉnh và thỏa thuận cấp phép phần mềm. Nó có thể được điều khiển từ hệ thống xây dựng thông qua công cụ dòng lệnh "dropdmg" hoặc AppleScript. Nếu muốn, các tệp RTF hình ảnh và giấy phép có thể được lưu trữ trong hệ thống kiểm soát phiên bản của bạn.


3
Nhóm của tôi có chức năng này hoạt động rất đẹp và tự động trên máy chủ xây dựng Jenkins CI, hoàn thành với nền, kéo đến bí danh Ứng dụng. Chạy, không đi bộ, đến DropDMG để tạo ảnh đĩa.
Paul Collins

Ứng dụng tốt, tôi sẽ mua nó sau khi dùng thử hết hạn.
kilik52

Có vẻ tốt, nhưng dường như không có tùy chọn để thay đổi kích thước cửa sổ.
avi

@avi DropDMG tự động điều chỉnh kích thước cửa sổ thành ảnh nền mà bạn đặt (hoặc chèn vào ảnh đó nếu muốn).
Michael Tsai

Cảm ơn rất nhiều! Có thể thay đổi kích thước mà không cần hình nền?
avi

6

Tôi đã tìm thấy ứng dụng mac tuyệt vời này để tự động hóa quy trình - http://www.araelium.com/dmgcanvas/ bạn phải xem nếu bạn đang tạo trình cài đặt dmg cho ứng dụng mac của mình


1
Lưu ý rằng đây không phải là một chương trình miễn phí, vì vậy nó không phù hợp với nhiều môi trường.
Jay Maynard K5ZC

5

Để tạo DMG đẹp mắt, giờ đây bạn có thể chỉ cần sử dụng một số nguồn mở được viết tốt:


Có thể họ đã di chuyển nó. Bạn có thể sử dụng create-dmg và node-appdmg. Tôi đang sử dụng tạo-dmg. Nó tốt
Anni S

@ PamelaCook-LightBeCorp Trong trường hợp bạn vẫn quan tâm. Liên kết đến dmgbuild đã được sửa.
Tối thiểu

4

Nếu bạn muốn đặt biểu tượng âm lượng tùy chỉnh thì sử dụng lệnh bên dưới

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

Bây giờ tạo đọc / ghi dmg

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

Bạn có thể giải thích "con đường của bạn" nghĩa là gì ở đây không? Tôi có thể sử dụng bất kỳ tệp biểu tượng nào trên đĩa không và SetFile sẽ sao chép nó hoặc tôi có cần sử dụng tệp nằm trong .dmg không? Tôi chỉ có một máy Mac, vì vậy thật khó để kiểm tra xem công cụ có hoạt động trên các máy khác không.
Milan Babuškov

"con đường của bạn" là tên DMG. (/ Tập / dmgName)
Parag Bafna

Bạn nên sao chép tập tin icns. cp "/Volume/customIcon.icns" "/Volume/dmgName/.VolumeIcon.icns"
Parag Bafna

4

Cuối cùng tôi đã làm việc này trong dự án của riêng tôi (điều này xảy ra trong Xcode). Thêm 3 tập lệnh này vào giai đoạn xây dựng của bạn sẽ tự động tạo Ảnh đĩa cho sản phẩm của bạn đẹp và gọn gàng. Tất cả bạn phải làm là xây dựng dự án của bạn và DMG sẽ chờ trong thư mục sản phẩm của bạn.

Tập lệnh 1 (Tạo hình ảnh đĩa tạm thời):

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

Tập lệnh 2 (Đặt tập lệnh thuộc tính cửa sổ):

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

Phép đo ở trên cho cửa sổ hoạt động cho dự án của tôi cụ thể do kích thước của hình nền và độ phân giải biểu tượng của tôi; bạn có thể cần phải sửa đổi các giá trị này cho dự án của riêng bạn.

Tập lệnh 3 (Tạo tập lệnh hình ảnh đĩa cuối cùng):

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

Đảm bảo các tệp hình ảnh bạn đang sử dụng nằm trong thư mục $ PRO DỰ_DIR / $ PRO DỰ_NAME /!


Nó đang tạo ra hình ảnh đĩa trống trong dự án của tôi. Bất kì lời đề nghị nào.
ManiaChamp

Phần kịch bản Shell chỉ hoạt động, nhưng làm cách nào tôi có thể thêm tập lệnh Apple với Shell Script trong RunScript trong Build Phase, nó đang hiển thị lỗi, mọi câu lệnh script của apple đều không tìm thấy biểu tượng.
ManiaChamp

2

.DS_Store tệp lưu trữ cài đặt windows trong Mac. Cài đặt Windows bao gồm bố cục biểu tượng, nền cửa sổ, kích thước của cửa sổ, v.v ... Tệp .DS_Store là cần thiết trong việc tạo cửa sổ cho hình ảnh được gắn để duy trì sự sắp xếp của tệp và nền của cửa sổ.

Khi bạn đã tạo tệp .DS_Store, bạn có thể sao chép nó vào trình cài đặt đã tạo (DMG).


Nhưng trước tiên hãy thêm một hình ảnh nền vào dmg bằng cách đặt tên nó là .background.png và sau đó sử dụng Cmd-J để thêm hình ảnh đó (!) Vào nền.
Gijs

2

Tôi cũng cần sử dụng phương pháp tiếp cận dòng lệnh để thực hiện việc đóng gói và tạo dmg "lập trình theo kịch bản". Câu trả lời tốt nhất tôi tìm thấy cho đến nay là từ khung xây dựng phát hành của dự án Adium (Xem R1). Có một tập lệnh tùy chỉnh (AdiumApplescriptRunner) để cho phép bạn tránh tương tác GUI OSX WindowsServer. Phương pháp "osascript applescript.scpt" yêu cầu bạn đăng nhập với tư cách là người xây dựng và chạy việc tạo dmg từ phiên lệnh vt100.

Hệ thống quản lý gói OSX không quá tiên tiến so với các Unixen khác có thể thực hiện nhiệm vụ này một cách dễ dàng và có hệ thống.

R 1: http://hg.adi.im/adi-1.4/file/00d944a3ef16/Release


2

Tôi vừa mới viết một tiện ích dòng lệnh mới (thân thiện) để làm điều này. Nó không phụ thuộc vào Finder / AppleScript hoặc vào bất kỳ API Trình quản lý bí danh (không dùng nữa) và dễ dàng định cấu hình và sử dụng.

Dù sao, bất cứ ai quan tâm đều có thể tìm thấy nó trên PyPi ; tài liệu có sẵn trên Đọc Tài liệu .


1

Những câu trả lời quá phức tạp và thời gian đã thay đổi. Sau đây hoạt động tốt trên 10.9, quyền là chính xác và nó trông đẹp.

Tạo DMG chỉ đọc từ một thư mục

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

Tạo DMG chỉ đọc với một biểu tượng (loại .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

Nếu bất cứ điều gì khác cần phải xảy ra, những điều dễ dàng nhất là tạo một bản sao tạm thời của SRC_DIR và áp dụng các thay đổi cho điều đó trước khi tạo DMG.


Câu trả lời này không thêm bất cứ điều gì vào những gì đã được viết trước đó và nó cũng không trả lời câu hỏi ban đầu (nó không chỉ là đặt một biểu tượng trong dmg, hoặc làm thế nào để ký nó; câu hỏi là về việc thêm đồ họa và các biểu tượng định vị theo chương trình một dmg).
Ludvig A. Norin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.