IT story

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

hot-time 2020. 5. 5. 19:35
반응형

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


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

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

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


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

  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

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

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

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


거기 가지마 장기적인 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를 찾은 후에는 모든 릴리스에 대해 업데이트하기가 정말 쉽습니다.


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

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의 제작자입니다)


이 주제에 관심이있는 분들을 위해 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

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


I found this great mac app to automate the process - http://www.araelium.com/dmgcanvas/ you must have a look if you are creating dmg installer for your mac app


If you want to set custom volume icon then use below command

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

Now create read/write dmg

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

For creating a nice looking DMG, you can now just use some well written open sources:


.DS_Store files stores windows settings in Mac. Windows settings include the icons layout, the window background, the size of the window, etc. The .DS_Store file is needed in creating the window for mounted images to preserve the arrangement of files and the windows background.

Once you have .DS_Store file created, you can just copy it to your created installer (DMG).


I also in need of using command line approach to do the packaging and dmg creation "programmatically in a script". The best answer I found so far is from Adium project' Release building framework (See R1). There is a custom script(AdiumApplescriptRunner) to allow you avoid OSX WindowsServer GUI interaction. "osascript applescript.scpt" approach require you to login as builder and run the dmg creation from a command line vt100 session.

OSX package management system is not so advanced compared to other Unixen which can do this task easily and systematically.

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


I've just written a new (friendly) command line utility to do this. It doesn’t rely on Finder/AppleScript, or on any of the (deprecated) Alias Manager APIs, and it’s easy to configure and use.

Anyway, anyone who is interested can find it on PyPi; the documentation is available on Read The Docs.


I finally got this working in my own project (which happens to be in Xcode). Adding these 3 scripts to your build phase will automatically create a Disk Image for your product that is nice and neat. All you have to do is build your project and the DMG will be waiting in your products folder.

Script 1 (Create Temp Disk Image):

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

Script 2 (Set Window Properties Script):

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

The above measurement for the window work for my project specifically due to the size of my background pic and icon resolution; you may need to modify these values for your own project.

Script 3 (Make Final Disk Image Script):

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

Make sure the image files you are using are in the $PROJECT_DIR/$PROJECT_NAME/ directory!


These answers are way too complicated and times have changed. The following works on 10.9 just fine, permissions are correct and it looks nice.

Create a read-only DMG from a directory

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

Create read-only DMG with an icon (.icns type)

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

If anything else needs to happen, these easiest thing is to make a temporary copy of the SRC_DIR and apply changes to that before creating a DMG.

참고URL : https://stackoverflow.com/questions/96882/how-do-i-create-a-nice-looking-dmg-for-mac-os-x-using-command-line-tools

반응형