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


212

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

Varolan bir derleme sistemine entegre olması için bir programda bu programlı olarak yapmam gerekiyor (sadece bir yükleyici sistemi oluşturduğundan, daha çok bir paket sistemi. Yapılar ayrı olarak yapılır).

Zaten "hdiutil" kullanarak yapılan DMG oluşturma var, ben henüz bir simge düzeni yapmak ve bir arka plan bitmap belirtmek olduğunu.


1
Bu Farklı Sor için bir şey değil mi?
Lenar Hoyt

Yanıtlar:


199

Birçok araştırmadan sonra, bu yanıtı buldum ve işte buraya kendi sorumun cevabı olarak, referans olarak koydum:

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

  2. Bir R / W DMG oluşturun. Sonuçtan daha büyük olmalıdır. Bu örnekte, bash değişkeni "size", Kb cinsinden boyutu içerir ve "source" 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ü bağlayın ve aygıt adını saklayın (bu işlemden sonra uyku modunu birkaç saniye 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'deki ".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 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. İzinleri düzgün bir şekilde ayarlayarak, sıkıştırarak ve serbest bırakarak DMG'yi sonlandırı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 
    

Snow Leopard'da, yukarıdaki elma simgesi simge konumunu doğru şekilde ayarlamayacak - bir Snow Leopard hatası gibi görünüyor. Bir çözüm, simgeleri ayarladıktan sonra sadece kapat / aç öğesini çağırmaktır, yani:

..
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
Mükemmel. Bununla ilgili iki soru: 1. sleepGörüntüyü kaldırdıktan sonra öneriyorsunuz . Ne kadar? Sürecin tamamlanmasını kararlı bir şekilde beklemek mümkün değil mi? delay 5AppleScript'iniz için de aynıdır . Onlarla çok kötü bir deneyim yaşadım, bu tür keyfi bekleme sürelerine her zaman dikkat ediyorum. 2. 6. adımınızda synciki kez arama yaparsınız - neden?
Konrad Rudolph

Belirleyici olarak 'uygulamaları kaydetmeden güncelleme' komutunun tamamlanmasını beklemenin bir yolunu bulamadım. Ben "hdiutil eklemek" sonra uyku gerekli olduğundan emin değilim, belgeleri (man hdiutil) kontrol etmek zorunda kalacak. Senkronizasyonun sadece bir kez çağrılması gerekir, eski eski alışkanlıklardan bu yana eski alışkanlığımdan iki kez yapıyorum.
Ludvig A. Norin

1
Applecript'in fare ve klavye girişini ve bir sürü başka şeyi simüle etmesini sağlar.
Ludvig A. Norin

1
Komut dosyası "uygulamaları kaydetmeden güncelle" satırında zaman aşımına uğrarsa, 1. adım tamamlanmamıştır (veya geri alınmıştır). Bunu zor yoldan öğrendim.
Jay Maynard K5ZC

Sanırım hafif bir aksaklık buldum - AppleScript'te chmod'u çalıştırmadan önce yapılan bir çıkartma var. disk çıkarıldığı için chmod başarısız olur.
Trejkaz

56

Özel arka planlar, özel simge konumlandırma ve birim adı ile süslü DMG'ler oluşturan create-dmg adlı küçük bir Bash betiği var .

Yıllar önce o zaman koştuğum şirket için yaptım; o zamandan beri diğer insanların katkısı üzerine hayatta kalıyor ve iyi çalıştığı bildiriliyor.

Ayrıca Node.js tabanlı daha modern ve aktif bir çabaya benzeyen düğüm-appdmg de var ; kontrol edin.


7
Bash betiğinizin bağlantısı koptu. Github.com'da bir özete koyabilir misiniz? Teşekkürler
dquimper

create-dmg vermez DEĞİL iyi simgesi yerleştirin. Bu özelliğe ihtiyacınız varsa kullanmayın.
laike9m

1
@ laike9m En son dokunduğumdan bu yana 5 yıldan fazla zaman geçti. DMG'leri artık Mac yazılımlarını dağıtmanın en iyi yolu olarak görmüyorum. Bu yüzden başkalarının katkılarıyla hayatta kalır - umarım birisi simgeler konusunu da çözer.
Andrey Tarantsov

3
@Zmey Bir kullanıcı olarak zip dosyalarını çok tercih ediyorum. /ApplicationsUygulamanın çalıştığını algılarsa otomatik kopyalama için bonus puan ~/Downloads. John Gruber'ın bu eski makalesine de bakınız .
Andrey Tarantsov


37

Oraya gitme. Uzun vadeli bir Mac geliştiricisi olarak, sizi temin ederim, hiçbir çözüm gerçekten iyi çalışmıyor. Çok fazla çözüm denedim, ama hepsi çok iyi değil. Bence sorun, Apple'ın gerekli veriler için meta veri formatını gerçekten belgelememesi.

Bunu uzun zamandır, çok başarılı bir şekilde yapıyorum:

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

  2. DMG'yi takın ve Finder'da manuel olarak veya bunu yapmak için size uygun olan herhangi bir araçla bir düzen verin (iyi bir araç için alttaki FileStorm bağlantısına bakın). Arka plan görüntüsü genellikle DMG'de gizli bir klasöre (".something") koyduğumuz bir resimdir. Uygulamanızın bir kopyasını oraya koyun (herhangi bir sürüm, eski olan bile olsa). Orada istediğiniz diğer dosyaları (takma adlar, benioku, vb) kopyalayın, yine, eski sürümler iyi olur. Simgelerin doğru boyutlara ve konumlara sahip olduğundan emin olun (IOW, DMG'yi olmasını istediğiniz şekilde düzenleyin).

  3. DMG'nin bağlantısını tekrar kesin, tüm ayarlar şimdiye kadar saklanmalıdır.

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

    • DMG'yi kopyalar, böylece orijinal olana bir daha dokunulmaz.
    • Kopyayı monte eder.
    • Tüm dosyaları en güncel olanlarla değiştirir (örneğin derlemeden sonra en son uygulama). Komut satırında bunun için mv veya ditto kullanabilirsiniz . Böyle bir dosyayı değiştirdiğinizde simge aynı kalacaktır, konum aynı kalacaktır, dosya (veya dizin) içeriği hariç her şey aynı kalır (en azından bu görev için genellikle kullandığımız ditto ile) . Elbette arka plan görüntüsünü başka biriyle de değiştirebilirsiniz (sadece aynı boyutlara sahip olduğundan emin olun).
    • Dosyaları değiştirdikten sonra, komut dosyasını DMG kopyasının bağlantısını kesin.
    • Son olarak, yazılabilir, sıkıştırılmış (ve yazılabilir olmayan) bir DMG'ye dönüştürmek için hdiutil'i arayın.

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

Sonuç: Aslında Xcode, yapının sonunda DMG üretebilir. Serbest bırakılmaya hazır bir DMG. Bu şekilde oldukça kolay bir geri alma DMG'si oluşturmakla kalmaz, aynı zamanda komut satırından (örneğin otomatik gece yapıları) xcodebuild kullanarak otomatik bir işlemde (isterseniz başsız bir sunucuda) bunu yapabilirsiniz.

Şablonun ilk düzeniyle ilgili olarak, FileStorm bunu yapmak için iyi bir araçtır. Ticari, ancak çok güçlü ve kullanımı kolaydır. Normal sürüm 20 dolardan az, bu yüzden gerçekten uygun. Belki bir DMG oluşturmak için FileStorm'u otomatikleştirebilir (örneğin AppleScript aracılığıyla), bunu hiç denemedim, ancak mükemmel DMG şablonunu bulduktan sonra, her sürüm için güncellemek gerçekten kolaydır.


3
Birkaç nedenden dolayı bunu bu şekilde yapma fikrini çoktan atmıştım. İşte bunlardan ikisi: yükleyicilerin içeriği ürüne göre değişecek ve sadece paket makinelerine ve komut dosyalarına yüklenen yazılımlara güvenmek istiyoruz - yeni ürünler eklemek için tek, minimal, manuel bir rutin.
Ludvig A.Norin

Bu bizim sahip olduğumuz senaryo ile aynı. Bir düzineden fazla ürünümüz var; her biri tamamen farklı bir DMG'ye sahiptir. Ürün başına bir şablon DMG oluşturmak tek seferlik bir görevdir ve birkaç dakika alır. Peki "yükleyici" ile ne demek istiyorsun? PKG / MPKG yükleme paketleri?
Mecki

Aynı senaryo değil. Kısa sürede haber vererek sık sık ürün ekliyoruz. Minimum manuel yordam, ürüne bir ad ve birkaç başka özellik veren bir komut dosyası çalıştırmak anlamına gelir. Bunun ötesinde, bu tür bir çözümü kullanmamaya karar vermemizi sağlayan sebepler de var.
Ludvig A. Norin

Paketleme sürecini derleme sürecinden ayırdık, çünkü farklı zamanlarda farklı insanlar tarafından yapılır. Paket işlemi Windows, Windows CE, Symbian, AIX, Linux ve Solaris için de yükleyiciler oluşturur.
Ludvig A.Norin

Muhtemelen hdutil'den değil hdiutil'den bahsediyorsunuz.
Ivan Vučica

25

Bu cevabı vererek bu soruyu güncel hale getirin.

appdmgbasit, kullanımı kolay, açık kaynaklı bir komut satırı programıdır ve basit bir json belirtiminden dmg dosyaları oluşturur. Resmi web sitesindeki benioku dosyasına bir göz atın:

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

Hızlı örnek:

  1. Appdmg kur

    npm install -g appdmg
    
  2. Bir json dosyası yazın ( 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
    

(feragat. Ben appmg'ın yaratıcısıyım)


3
basit ve etkili. Tek dezavantajı, npm'nin kurulmasını gerektirmesidir
Jack James

@Creator: Sürükleyip bırakmak zorunda kalmadan lütfen bu teklif GUI'si gibi ilerleyebilir misiniz? s.sudre.free.fr/Software/Packages/about.html

.App dosyası json dosyasıyla aynı klasörde değilse, bu işe yaramazsa, "yol" da göreceli bir yol belirttiğinizde "dosya bulunamadı" hatası verir
Joey

@Joey, sizin için işe yaramazsa Github deposunda bir sorun açabilir misiniz?
Linus Unnebäck

@Joey: Aynı klasörde olmak zorunda değilim, arka planım var, farklı yollarda uygulama var, sadece ../../../ABC gibi göreceli yolları geç
Anoop Vaidya

22

Bu konuyla ilgilenenler için DMG'yi nasıl oluşturduğumu 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

1
Bu iyi, ancak gerçek ihtiyacı karşılamıyor (arka plan görüntüsü, klasördeki öğelerin konumlandırılması, vb.)
Tom Bogle

oluşturulan DMG ama yine CMD kullanarak Script (.sh) çalıştırmak zorunda ben otomatik olarak sh DMG oluşturduktan sonra sh çalıştırmak gerekir
SANTOSH

13

Uygulamam DropDMG , arka plan resimleri, simge düzenleri, özel birim simgeleri ve yazılım lisans sözleşmeleri içeren disk görüntüleri oluşturmanın kolay bir yoludur. Bir yapı sisteminden "dropdmg" komut satırı aracı veya AppleScript aracılığıyla kontrol edilebilir. İstenirse, resim ve lisans RTF dosyaları sürüm kontrol sisteminizde saklanabilir.


3
Ekibim bunun arka planı ile birlikte bir Jenkins CI derleme sunucusunda güzel ve otomatik olarak çalışmasını sağlar, Uygulamalar takma adına sürükleyin. Disk görüntüleri oluşturmak için RunDMG'ye koşun, yürümeyin.
Paul Collins

İyi Uygulama, deneme sürem dolduktan sonra satın alacağım.
kilik52

Güzel görünüyor, ancak pencereyi yeniden boyutlandırma seçeneği yok gibi görünüyor.
avi

(veya @avi DropDMG otomatik olarak arka plan ayarladığınız resme pencereyi boyutları yerleşsin istenirse o resmin içine).
Michael Tsai

Çok teşekkürler! Arka plan resmi olmadan yeniden boyutlandırma mümkün müdür?
avi


5

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


Hareket ettirmiş olabilirler. Create-dmg ve node-appdmg kullanabilirsiniz. Ben create-dmg kullanıyorum. Bu iyi.
Anni S

@ PamelaCook-LightBeCorp Halen ilgileniyorsanız. Dmgbuild bağlantısı düzeltildi.
SubOptimal

4

Özel ses ayarı 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'si oluşturun

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

Burada "yolunuzun" ne anlama geldiğini açıklayabilir misiniz? Diskteki herhangi bir simge dosyasını kullanabilir miyim ve SetFile bunu kopyalar mı yoksa .dmg içindeki bir dosyayı kullanmam gerekir mi? Sadece bir Mac'im var, bu yüzden diğer makinelerde işlerin çalışıp çalışmadığını test etmek zor.
Milan Babuškov

"yolunuz" DMG adıdır. (/ Ciltler / dmgAdı)
Parag Bafna

İcns dosyasını kopyalamalısınız. cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
Parag Bafna

4

Sonunda bu projeyi kendi projemde aldım (Xcode'da oluyor). Bu 3 komut dosyasını oluşturma aşamanıza eklemek, ürününüz için otomatik olarak güzel ve düzenli bir Disk Görüntüsü oluşturur. Yapmanız gereken tek şey projenizi oluşturmak ve DMG ürünler klasöründe bekliyor olacak.

Komut Dosyası 1 (Geçici 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

Komut Dosyası 2 (Pencere Özellikleri Komut Dosyasını Ayarla):

#!/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 yukarıdaki ölçüm, özellikle arka plan resmimin boyutu ve simge çözünürlüğü nedeniyle projem için çalışıyor; kendi projeniz için bu değerleri değiştirmeniz gerekebilir.

Komut Dosyası 3 (Son Disk Görüntüsü Komut Dosyasını 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!


Projemde boş disk görüntüsü oluşturuyor. Herhangi bir öneri.
ManiaChamp

Shell script kısmı sadece çalışır, ancak Build Schase altında RunScript'te Apple script'i nasıl ekleyebilirim hata gösteriyor, her apple script deyimi sembol bulunamadı.
ManiaChamp

2

.DS_Store dosyaları, Mac'te Windows ayarlarını saklar. Windows ayarları simgeler düzenini, pencere arka planını, pencerenin boyutunu vb. İçerir. Dosyaların ve pencere arka planının korunmasını sağlamak için bağlı görüntüler için pencere oluştururken .DS_Store dosyası gereklidir.

.DS_Store dosyanızı oluşturduktan sonra, oluşturduğunuz yükleyiciye (DMG) kopyalayabilirsiniz.


Ancak önce dmg'ye .background.png gibi bir ad vererek bir arka plan görüntüsü ekleyin ve sonra bu (!) Görüntüyü arka plana eklemek için Cmd-J'yi kullanın.
Gijs

2

Ben de ambalaj ve dmg oluşturma "programlı bir komut dosyasında" yapmak için komut satırı yaklaşımını kullanmak gerekiyor. Şimdiye kadar bulduğum en iyi cevap Adium projesi 'Sürüm oluşturma çerçevesinden (Bkz. R1). OSX WindowsServer GUI etkileşiminden kaçınmanıza izin veren özel bir komut dosyası (AdiumApplescriptRunner) vardır. "osascript applescript.scpt" yaklaşımı, oluşturucu olarak giriş yapmanızı ve dmg oluşturma işlemini bir komut satırı vt100 oturumundan çalıştırmanızı gerektirir.

OSX paket yönetim sistemi, bu görevi kolay ve sistematik olarak yapabilen diğer Unixen ile karşılaştırıldığında çok gelişmiş değildir.

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


2

Bunu yapmak için yeni (dostça) bir komut satırı yardımcı programı yazdım. Finder / AppleScript veya herhangi bir (kullanımdan kaldırılmış) Takma Ad Yöneticisi API'sine dayanmaz ve yapılandırılması ve kullanımı kolaydır.

Her neyse, ilgilenen herkes PyPi'de bulabilir ; dokümanları Dokümanları Oku bölümünde bulabilirsiniz .


1

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

Bir dizinden salt okunur DMG oluşturma

#!/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şturma (.icns tipi)

#!/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 şey olması gerekiyorsa, bu en kolay şey SRC_DIR'in geçici bir kopyasını oluşturmak ve bir DMG oluşturmadan önce değişiklik yapmaktır.


Bu cevap, daha önce yazılanlara hiçbir şey eklemiyor ve aynı zamanda orijinal soruya cevap vermiyor (sadece dmg'ye bir simge koymak ya da nasıl imzalanacağı değil; soru grafik olarak grafik ve konumlandırılmış simgeler eklemekle ilgili. bir dmg).
Ludvig A.Norin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.