it-swarm-tr.com

Komut satırı araçlarını kullanarak Mac OS X için güzel görünümlü bir DMG'yi nasıl oluşturabilirim?

Bir Mac uygulaması için güzel bir yükleyici oluşturmam gerekiyor. Önceden tanımlanmış bir boyut, düzen ve arka plan görüntüsü ile bir disk görüntüsü (DMG) olmasını istiyorum.

Bunu mevcut bir derleme sistemine dahil olmak için programlı olarak bir betikte yapmam gerekiyor (yalnızca bir paketleme sistemi daha fazlası, çünkü yalnızca yükleyiciler yaratıyor. Derlemeler ayrı ayrı yapılır).

DMG oluşturma işlemini zaten "hdiutil" kullanarak yaptım, henüz bulamadım, nasıl bir simge düzeni oluşturacağımı ve bir arka plan bitmapini nasıl belirleyeceğimi biliyorum.

205
Ludvig A. Norin

Çok fazla araştırmadan sonra, bu cevabı buldum ve burada referans olarak kendi soruma cevap olarak buraya koyuyorum:

  1. Sistem Tercihleri ​​>> Evrensel Erişim'de "Yardımcı cihazlara erişimi etkinleştir" seçeneğinin işaretli olduğundan emin olun. AppleScript çalışması için gereklidir. Bu değişiklikten sonra yeniden başlatmanız gerekebilir (aksi halde Mac OS X Server 10.4'te çalışmaz).

  2. Bir R/W DMG oluşturun. Sonuç olacağından daha büyük olması gerekir. Bu örnekte, "size" bash değişkeni Kb içindeki boyutu içerir ve "kaynak" bash değişkenindeki klasörün içeriği DMG'ye kopyalanır:

    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. Disk görüntüsünü yerleştirin ve cihazın adını kaydedin (bu işlemden sonra birkaç saniye uyku kullanmak isteyebilirsiniz):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Arka plan resmini (PNG formatında) DMG'de ".background" adlı bir klasörde saklayın ve adını "backgroundPictureName" değişkeninde saklayın.

  5. Görsel stilleri ayarlamak için AppleScript kullanın (.app'ın adı "applicationName" bash değişkeninde olmalı, diğer özellikler için değişkenleri gerektiği gibi kullanı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. DMG'yi izinleri doğru ayarlayarak, sıkıştırarak ve serbest bırakarak finialize edin:

    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'da, yukarıdaki el yazısı simge konumunu doğru ayarlamaz - Snow Leopard hatası gibi görünüyor. Çözümlerden biri, simgeleri ayarladıktan sonra basitçe kapatmak/açmak aramaktır.

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

Özel arka planlar, özel simge konumlandırma ve cilt adı ile süslü DMG'ler oluşturan create-dmg adında küçük bir Bash komut dosyası var.

Bunu yıllar önce koştuğum şirket için inşa ettim; o zamandan beri diğer insanların katkısı üzerinde hayatta kalmakta ve iyi olduğu bildirilmektedir.

Ayrıca node-appdmg , Node.js tabanlı daha modern ve aktif bir çabaya benzeyen; Bunu da kontrol et.

56
Andrey Tarantsov

Oraya gitme. Uzun vadeli bir Mac geliştiricisi olarak sizi temin ederim ki, hiçbir çözüm gerçekten iyi sonuç vermiyor. Çok fazla çözüm denedim, ama hepsi iyi değil. Sanırım problem şu ki, Apple gerekli veriler için meta veri formatını gerçekten belgelendirmiyor.

Uzun zamandır çok başarılı bir şekilde yapıyorum:

  1. Readme (seyrek işe yarayabilir) gibi beklenen ikili ve ekstra dosyaları tutacak kadar büyük, yazılabilir (!), Yeni bir DMG oluşturun.

  2. DMG'yi monte edin ve Finder'da manuel olarak veya bunu yapmak için size uygun olan araçları içeren bir düzen verin (iyi bir araç için alttaki FileStorm bağlantısına bakın). Arka plan resmi genellikle DMG'de gizli bir klasöre (".something") koyduğumuz bir resimdir. Uygulamanızın bir kopyasını oraya yerleştirin (herhangi bir sürüm, hatta eski olan bile yapabilir). İstediğiniz diğer dosyaları (takma adlar, benioku vb.) Kopyalayın, yine eski sürümler iyi sonuç verecektir. Simgelerin doğru boyut ve konumlara sahip olduğundan emin olun (IOW, DMG'yi istediğiniz şekilde düzenleyin).

  3. DMG'yi tekrar çıkarın, tüm ayarlar şimdiye kadar kaydedilmelidir.

  4. Aşağıdaki gibi çalışan bir yaratma DMG betiği yazın:

    • DMG'yi kopyalar, böylece orijinal olana bir daha asla dokunulmaz.
    • Kopyayı bağlar.
    • Tüm dosyaları en güncelleriyle değiştirir (örneğin, derlemeden sonraki en son uygulama). Komut satırında bunun için mv veya ditto kullanabilirsiniz. Böyle bir dosyayı değiştirdiğinizde, simgenin aynı kalacağını, konumun aynı kalacağını unutmayın; dosya (veya dizin) içeriği dışındaki her şey aynı kalır (en azından bu görev için kullandığımız ditto ile) . Elbette arka plan resmini başka bir resimle de değiştirebilirsiniz (sadece aynı boyutlara sahip olduğundan emin olun).
    • Dosyaları değiştirdikten sonra betiğin tekrar DMG kopyasını çıkarmasını sağlayın.
    • Sonunda, yazılabilir, sıkıştırılmış (ve yazılabilir olmayan) bir DMG'ye dönüştürmek için hdiutil'i çağırın.

Bu yöntem optimal gelmeyebilir, ama güven bana, pratikte gerçekten iyi çalışıyor. Orijinal DMG'yi (DMG şablonu) sürüm kontrolü altında (örneğin, SVN) bile yerleştirebilirsiniz, böylece yanlışlıkla yanlışlıkla değiştirir/yok ederseniz, hala tamam olduğu bir revizyona geri dönebilirsiniz. DMG şablonunu, Xcode projenize, DMG'ye ait tüm diğer dosyalarla birlikte (readme, URL dosyası, arka plan görüntüsü) sürüm kontrolü altında ekleyebilir ve ardından bir hedef oluşturabilirsiniz (örneğin, "DMG Oluştur" adlı bir dış hedef) ve yukarıdaki DMG betiğini yürütün ve eski ana hedefinizi bağımlı hedef olarak ekleyin. Xcode ağacındaki dosyalara komut dosyasındaki $ {SRCROOT} öğesini kullanarak (her zaman ürününüzün kaynak köküdür) ve $ {BUILT_PRODUCTS_DIR} öğesini kullanarak yapı ürünlerine erişebilirsiniz (Xcode'un derleme sonuçlarını oluşturduğu dizindir) .

Sonuç: Aslında Xcode, derlemenin sonunda DMG'yi üretebilir. Serbest bırakılmaya hazır bir DMG. Sadece bu şekilde oldukça kolay olan bir relase DMG oluşturmakla kalmaz, bunu aslında otomatik bir işlemde (isterseniz başsız bir sunucuda), komut satırından xcodebuild kullanarak (örneğin, otomatik olarak oluşturulan otomatik derlemeler) yapabilirsiniz.

Şablonun başlangıç ​​düzenine gelince, FileStorm bunu yapmak için iyi bir araçtır. Ticaridir, ancak çok güçlü ve kullanımı kolaydır. Normal sürüm 20 dolardan az, bu yüzden gerçekten uygun. Belki bir kimse bir DMG oluşturmak için FileStorm'u otomatikleştirebilir (örneğin, AppleScript aracılığıyla), bunu hiç denemedim, ancak mükemmel DMG şablonunu bulduğunuzda, her sürüm için güncellemesi gerçekten çok kolay.

37
Mecki

Bu soruyu sağlayarak bu soruyu gündeme getirin.

appdmg, basit bir json belirtiminden dmg dosyaları oluşturan basit, kullanımı kolay, açık kaynaklı bir komut satırı programıdır. Resmi web sitesinde benioku bir göz atın:

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

Hızlı örnek:

  1. Appdmg yükleyin

    npm install -g appdmg
    
  2. Bir json dosyası yaz (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. Programı çalıştır

    appdmg spec.json test.dmg
    

(feragatname. Ben appdmg'nin yaratıcısıyım)

26
Linus Unnebäck

Bu konuyla ilgilenenler için, DMG'yi nasıl yarattığımı belirtmeliyim:

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

nerede

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
22
Ludvig A. Norin

Uygulamam DropDMG , arka plan resimleri, simge düzenleri, özel ses simgeleri ve yazılım lisans sözleşmeleriyle disk görüntüleri oluşturmanın kolay bir yoludur. "Dropdmg" komut satırı aracı veya AppleScript ile bir derleme sisteminden kontrol edilebilir. İstenirse, resim ve lisans RTF dosyaları sürüm kontrol sisteminizde saklanabilir.

14
Michael Tsai

İşlemi otomatikleştirmek için bu harika mac uygulamasını buldum - http://www.araelium.com/dmgcanvas/ mac uygulamanız için dmg yükleyici oluştururken bir göz atmanız gerekir

5
Saurabh

Özel ses simgesi ayarlamak istiyorsanız aşağıdaki komutu kullanın.

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

Şimdi okuma/yazma dmg oluşturun

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

Güzel görünümlü bir DMG oluşturmak için, şimdi sadece iyi yazılmış bazı açık kaynakları kullanabilirsiniz:

4
Anni S

.DS_Store dosyaları, Windows ayarlarını Mac'te saklar. Windows ayarları, simgeler düzenini, pencerenin arka planını, pencerenin boyutunu vb. İçerir.

.DS_Store dosyası oluşturulduktan sonra, sadece oluşturduğunuz yükleyiciye (DMG) kopyalayabilirsiniz.

2
hor10zs

Ayrıca paketleme ve dmg oluşturma işlemlerini "programsal olarak bir komut dosyasında" yapmak için komut satırı yaklaşımını kullanmaya ihtiyacım var. Şimdiye kadar bulduğum en iyi cevap Adium projesinin 'Release bina çerçevesi' (R1). OSX WindowsServer GUI etkileşimini önlemenize izin veren özel bir script (AdiumApplescriptRunner) vardır. "osascript applescript.scpt" yaklaşımı, oluşturucu olarak giriş yapmanızı ve vt100 oturumunun komut satırından dmg oluşturmayı çalıştırmanızı gerektirir.

OSX paket yönetim sistemi, bu görevi kolay ve sistematik bir şekilde yapabilen diğer Unixen'lere kıyasla çok gelişmiş değildir.

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

2
T.J. Yang

Sonunda bu çalışmayı kendi projemde (Xcode'da olduğu gibi) elde ettim. Bu 3 komut dosyasını derleme aşamasına eklemek, ürününüz için otomatik olarak Güzel ve düzenli bir Disk Görüntüsü oluşturacaktır. Tek yapmanız gereken projenizi oluşturmak ve DMG ürünler klasörünüzde bekliyor olacak.

Script 1 (Temp Disk Görüntüsü Oluştur):

#!/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 Pencere Özellikleri Komut Dosyası):

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

Pencere için yapılan yukarıdaki ölçüm, özellikle arkaplan resmimin boyutu ve simge çözünürlüğünden dolayı projem için çalışıyor; Bu değerleri kendi projeniz için değiştirmeniz gerekebilir.

Script 3 (Final Disk Image Script Yap):

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

Kullandığınız görüntü dosyalarının $ PROJECT_DIR/$ PROJECT_NAME/dizininde olduğundan emin olun!

2
P.M.

Bunu yapmak için yeni (kolay) bir komut satırı yardımcı programı yazdım. Finder/AppleScript'e veya (kullanımdan kaldırılmış) Diğer Ad Yöneticisi API'lerine dayanmaz ve yapılandırılması ve kullanılması kolaydır.

Neyse, ilgilenen herkes PyPi'de bulabilir ; Belgeler Belgeleri Oku'da bulunur .

1
alastair

Bu cevaplar çok karmaşık ve zamanlar değişti. Aşağıdaki 10.9 sadece iyi çalışıyor, izinler doğru ve Güzel görünüyor.

Bir dizinden salt okunur bir DMG oluşturun

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

Bir simgeyle salt okunur DMG oluşturun (.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

Başka bir şeyin olması gerekiyorsa, bu en kolay şey SRC_DIR'ın geçici bir kopyasını çıkarmak ve DMG oluşturmadan önce üzerinde değişiklik yapmaktır.

1
user246672