명령 줄 도구를 사용하여 Mac OS X 용 DMG를 어떻게 멋지게 만들 수 있습니까?


212

Mac 응용 프로그램을위한 멋진 설치 프로그램을 만들어야합니다. 미리 정의 된 크기, 레이아웃 및 배경 이미지가있는 디스크 이미지 (DMG)가되고 싶습니다.

기존 빌드 시스템에 통합하려면 스크립트에서 프로그래밍 방식 으로이 작업을 수행해야합니다 (설치 프로그램 만 생성하기 때문에 팩 시스템의 더 많은 부분이 있습니다. 빌드는 별도로 수행됩니다).

이미 "hdiutil"을 사용하여 DMG를 만들었습니다. 아직 알지 못한 것은 아이콘 레이아웃을 만들고 배경 비트 맵을 지정하는 방법입니다.


1
Ask Different에 해당되지 않습니까?
레나 호이트

답변:


199

많은 연구를 한 후에 나는이 대답을 생각해 냈고, 나는 그것을 여기에 내 자신의 질문에 대한 대답으로 여기에 넣었습니다.

  1. 시스템 환경 설정 >> 범용 액세스에서 "보조 장치에 대한 액세스 활성화"가 선택되어 있는지 확인하십시오. AppleScript가 작동해야합니다. 이 변경 후 재부팅해야 할 수도 있습니다 (Mac OS X Server 10.4에서는 작동하지 않습니다).

  2. R / W DMG를 만듭니다. 결과보다 커야합니다. 이 예에서 bash 변수 "size"는 Kb의 크기를 포함하고 "source"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. 배경 그림 (PNG 형식)을 DMG의 ".background"폴더에 저장하고 "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 버그 인 것 같습니다. 한 가지 해결 방법은 아이콘을 설정 한 후 간단히 닫기 / 열기를 호출하는 것입니다.

..
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 5AppleScript에서도 동일합니다 . 나는 항상 그러한 임의의 대기 시간에 대해 조심합니다. 2. 6 단계에서 전화를 sync두 번 – 왜합니까?
Konrad Rudolph

'응용 프로그램을 등록하지 않고 업데이트'명령이 완료 될 때까지 결정적으로 기다리는 방법을 찾지 못했습니다. "hdiutil attach"후에 수면이 필요한지 확실하지 않으므로 설명서 (man hdiutil)를 확인해야합니다. 동기화는 한 번만 호출하면되며, 좋은 SunOS 시절 이래로 오래된 습관을 두 번 사용합니다.
Ludvig A. Norin

1
애플 스크립트는 마우스와 키보드 입력 및 기타 여러 가지를 시뮬레이션 할 수 있습니다.
Ludvig A. Norin

1
"응용 프로그램을 등록하지 않고 업데이트"줄에서 스크립트가 시간 초과 될 때까지 스크립트가 중단되면 1 단계가 완료되지 않았거나 취소 된 것입니다. 방금 어려운 것을 알았습니다.
Jay Maynard K5ZC

나는 약간의 결함을 발견했다고 생각합니다. AppleScript에는 chmod를 실행하기 전에 꺼내기가 있습니다. 디스크가 배출되었으므로 chmod가 실패합니다.
Trejkaz

56

사용자 정의 배경, 사용자 정의 아이콘 위치 및 볼륨 이름으로 멋진 DMG 를 빌드하는 create-dmg 라는 작은 Bash 스크립트가 있습니다 .

나는 수년 전에 내가 운영했던 회사를 위해 그것을 구축했습니다. 그 이후로 다른 사람들의 공헌으로 살아남으며 잘 작동합니다.

Node.js에 기반한보다 현대적이고 적극적인 노력처럼 보이는 node-appdmg 도 있습니다 . 그것도 확인하십시오.


7
bash 스크립트에 대한 링크가 손상되었습니다. github.com의 요지에 넣을 수 있습니까? 감사
dquimper

create-dmg가 아이콘을 제대로 배치하지 않습니다 . 이 기능이 필요한 경우 사용하지 마십시오.
laike9m

1
@ laike9m 마지막으로 만진 지 5 년이 넘었습니다. DMG가 더 이상 Mac 소프트웨어를 배포하는 가장 좋은 방법이라고 생각하지 않습니다. 그래서 그것은 다른 사람들의 공헌에도 살아 남았습니다. 누군가가 아이콘 문제도 알아낼 수 있기를 바랍니다.
Andrey Tarantsov

3
@Zmey 사용자로서 나는 zip 파일을 훨씬 선호한다. /Applications앱에서 실행중인 앱을 감지하면 자동 복사에 대한 보너스 포인트 ~/Downloads. John Gruber의이 오래된 기사 도 참조하십시오 .
Andrey Tarantsov


37

거기 가지마 장기적인 Mac 개발자로서 확실한 해결책은 없습니다. 나는 많은 솔루션을 시도했지만 너무 좋지는 않습니다. 문제는 Apple이 실제로 필요한 데이터에 대한 메타 데이터 형식을 문서화하지 않는다는 것입니다.

다음은 오랫동안 성공적으로 수행하는 방법입니다.

  1. readme와 같은 예상 바이너리 및 추가 파일을 저장할 수있을 정도로 큰 쓰기 가능한 (!) 새 DMG를 작성하십시오 (스파 스가 작동 할 수 있음).

  2. DMG를 마운트하고 Finder에서 수동으로 또는 적절한 도구를 사용하여 레이아웃을 지정하십시오 (좋은 도구는 하단의 FileStorm 링크 참조). 배경 이미지는 일반적으로 DMG의 숨겨진 폴더 ( ".something")에 넣은 이미지입니다. 거기에 앱의 사본을 넣으십시오 (구 버전, 심지어 구식 버전). 원하는 다른 파일 (별칭, readme 등)을 복사하십시오. 오래된 버전은 정상적으로 작동합니다. 아이콘의 크기와 위치가 올바른지 확인하십시오 (IOW, 원하는 방식으로 DMG 레이아웃).

  3. DMG를 다시 마운트 해제하면 모든 설정이 저장됩니다.

  4. 다음과 같이 작동하는 create DMG 스크립트를 작성하십시오.

    • DMG를 복사하므로 원본을 다시 만지지 않습니다.
    • 사본을 마운트합니다.
    • 모든 파일을 최신 파일로 바꿉니다 (예 : 빌드 후 최신 앱). mv 를 사용 하거나 ditto명령 행에서 를 . 그런 파일을 교체하면 아이콘은 그대로 유지되고 위치는 동일하게 유지되며 파일 (또는 디렉토리) 내용을 제외한 모든 내용은 동일하게 유지됩니다 (적어도 그 작업에는 일반적으로 사용되는 ditto) . 물론 배경 이미지를 다른 이미지로 바꿀 수도 있습니다 (크기가 같은지 확인하십시오).
    • 파일을 교체 한 후 스크립트에서 DMG 사본을 다시 마운트 해제하십시오.
    • 마지막으로 hdiutil을 호출하여 쓰기 가능 파일을 압축 된 (쓰기 불가능한) DMG로 변환하십시오.

이 방법은 최적으로 들리지 않을 수도 있지만 실제로는 실제로 잘 작동합니다. 버전 제어 (예 : SVN)에서도 원본 DMG (DMG 템플릿)를 넣을 수 있으므로 실수로 변경 / 파기 한 경우에도 여전히 수정본으로 돌아갈 수 있습니다. 버전 관리하에 DMG에 속한 다른 모든 파일 (readme, URL 파일, 배경 이미지)과 함께 DMG 템플릿을 Xcode 프로젝트에 추가 한 다음 대상 (예 : "Create DMG"라는 외부 대상)을 만들 수 있습니다. 위의 DMG 스크립트를 실행하고 이전 주 대상을 종속 대상으로 추가하십시오. 스크립트에서 $ {SRCROOT}를 사용하여 Xcode 트리의 파일에 액세스 할 수 있으며 (항상 제품의 소스 루트 임) $ {BUILT_PRODUCTS_DIR}을 사용하여 빌드 제품에 액세스 할 수 있습니다 (항상 Xcode가 빌드 결과를 작성하는 디렉토리 임) .

결과 : 실제로 Xcode는 빌드가 끝날 때 DMG를 생성 할 수 있습니다. 출시 준비가 된 DMG. 릴리스 DMG를 그렇게 쉽게 만들 수있을뿐만 아니라 명령 줄에서 xcodebuild (예 : 자동화 된 야간 빌드)를 사용하여 자동화 된 프로세스 (원하는 경우 헤드리스 서버)에서 실제로 만들 수 있습니다.

템플릿의 초기 레이아웃과 관련하여 FileStorm 은 템플릿을 만드는 데 유용한 도구입니다. 상업적이지만 매우 강력하고 사용하기 쉽습니다. 일반 버전은 20 달러 미만이므로 정말 저렴합니다. 어쩌면 FileStorm을 자동화하여 DMG (예 : AppleScript를 통해)를 만들 수는 있지만 절대 시도하지는 않았지만 완벽한 템플릿 DMG를 찾은 후에는 모든 릴리스에 대해 업데이트하기가 정말 쉽습니다.


3
나는 여러 가지 이유로 이미 이런 식으로하는 아이디어를 버렸습니다. 다음은 두 가지입니다. 설치 프로그램의 내용은 제품마다 다르며 팩 시스템 및 스크립트에 설치된 소프트웨어 (새 제품 추가를위한 최소한의 수동 단일 루틴)에만 의존하려고합니다.
Ludvig A. Norin

이것은 우리와 같은 시나리오입니다. 우리는 12 가지 이상의 제품을 보유하고 있습니다. 각각 완전히 다른 DMG가 있습니다. 제품 당 하나의 템플릿 DMG 생성은 한 번의 작업이며 몇 분이 걸립니다. "설치자"란 무엇을 의미합니까? PKG / MPKG 설치 패키지?
Mecki September

같은 시나리오가 아닙니다. 우리는 짧은 통지와 함께 제품을 자주 추가합니다. 최소 수동 루틴은 제품에 이름과 몇 가지 다른 속성을 제공하는 스크립트를 실행하는 것을 의미합니다. 이 외에도 다른 종류의 솔루션을 사용하지 않기로 결정한 이유도 있습니다.
Ludvig A. Norin

팩 프로세스는 다른 시간에 다른 사람들이 수행하기 때문에 빌드 프로세스와 분리되었습니다. 팩 프로세스는 Windows, Windows CE, Symbian, AIX, Linux 및 Solaris 용 설치 프로그램도 작성합니다.
Ludvig A. Norin

아마도 hdutil이 아니라 hdiutil을 참조하고있을 것입니다.
Ivan Vučica

25

이 답변을 제공하여이 질문을 최신 상태로 유지하십시오.

appdmg간단한 json 사양에서 dmg 파일을 만드는 간단하고 사용하기 쉬운 오픈 소스 명령 줄 프로그램입니다. 공식 웹 사이트에서 읽어보기를 살펴보십시오.

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

@Joey, Github 저장소에서 문제가 발생하면 문제를 해결할 수 있습니까?
Linus Unnebäck

@Joey : 그것은 같은 폴더에있을 필요가 없습니다, 나는 배경, 응용 프로그램이 다른 경로에 모두 있습니다. ../../../ABC와 같은 상대 경로를 전달하십시오.
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를 만들었지 만 다시 CMD를 사용하여 Script (.sh)를 실행해야합니다. DMG를 만든 후 자동으로 sh를 실행해야합니다.
SANTOSH

13

내 앱 DropDMG 는 배경 그림, 아이콘 레이아웃, 사용자 지정 볼륨 아이콘 및 소프트웨어 라이센스 계약으로 디스크 이미지를 만드는 쉬운 방법입니다. "dropdmg"명령 줄 도구 또는 AppleScript를 통해 빌드 시스템에서 제어 할 수 있습니다. 원하는 경우 사진 및 라이센스 RTF 파일을 버전 관리 시스템에 저장할 수 있습니다.


3
우리 팀은 Jenkins CI 빌드 서버에서 아름답고 자동 으로이 작업을 수행하며 배경으로 완성하고 응용 프로그램 별칭으로 드래그합니다. 디스크 이미지를 만들기 위해 DropDMG로 이동하지 마십시오.
Paul Collins

좋은 앱, 평가판이 만료 된 후 구매하겠습니다.
kilik52

멋지게 보이지만 창 크기를 조정할 수있는 옵션이없는 것 같습니다.
avi

@avi DropDMG는 사용자가 설정 한 배경 그림에 맞게 창의 크기를 자동으로 조정합니다 (또는 원하는 경우 해당 그림에 삽입 됨).
Michael Tsai

감사합니다! 배경 이미지없이 크기를 조정할 수 있습니까?
avi


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이 하나뿐이므로 다른 컴퓨터에서 작동하는지 테스트하기가 어렵습니다.
밀라노 Babuškov

"경로"는 DMG 이름입니다. (/ Volumes / 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

셸 스크립트 부분 만 작동하지만 빌드 단계에서 RunScript의 셸 스크립트로 Apple 스크립트를 추가하는 방법에 오류가 표시됩니다. 모든 Apple 스크립트 문을 찾을 수 없습니다.
ManiaChamp

2

.DS_Store 파일은 Windows 설정 창을 Mac에 저장합니다. Windows 설정에는 아이콘 레이아웃, 창 배경, 창 크기 등이 포함됩니다. .DS_Store 파일은 파일 및 창 배경의 배열을 유지하기 위해 탑재 된 이미지의 창을 만드는 데 필요합니다.

.DS_Store 파일이 생성되면 생성 된 설치 관리자 (DMG)로 파일을 복사하면됩니다.


그러나 먼저 .background.png와 같은 이름을 지정하고 Cmd-J를 사용하여 배경 이미지를 배경에 추가하여 dmg에 배경 이미지를 추가하십시오.
Gijs

2

또한 패키징 및 dmg 작성을 "프로그램 적으로 스크립트로"수행하기 위해 명령 행 접근 방식을 사용해야합니다. 지금까지 내가 찾은 가장 좋은 대답은 Adium 프로젝트의 릴리스 빌딩 프레임 워크 (R1 참조)입니다. OSX WindowsServer GUI 상호 작용을 피할 수있는 사용자 정의 스크립트 (AdiumApplescriptRunner)가 있습니다. "osascript applescript.scpt"방식을 사용하려면 빌더로 로그인하고 명령 행 vt100 세션에서 dmg 작성을 실행해야합니다.

OSX 패키지 관리 시스템은이 작업을 쉽고 체계적으로 수행 할 수있는 다른 Unixen에 비해 그렇게 발전되지 않았습니다.

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



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 유형)으로 읽기 전용 DMG 만들기

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

다른 작업이 필요한 경우 가장 쉬운 방법은 SMG_DIR의 임시 복사본을 만들어 DMG를 만들기 전에 변경 사항을 적용하는 것입니다.


이 답변은 이전에 작성된 내용에 아무것도 추가하지 않으며 원래 질문에 대답하지 않습니다 (dmg에 아이콘을 넣거나 서명하는 방법이 아닙니다. 질문은 프로그래밍 방식으로 그래픽과 위치 아이콘을 추가하는 것에 관한 것입니다) dmg).
Ludvig A. Norin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.