Как я создаю привлекательный DMG для Mac OS X с помощью инструментов командной строки?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

209
задан 4 revs, 2 users 100% 22 February 2011 в 03:26
поделиться

6 ответов

After lots of research, I've come up with this answer, and I'm hereby putting it here as an answer for my own question, for reference:

  1. Make sure that "Enable access for assistive devices" is checked in System Preferences>>Universal Access. It is required for the AppleScript to work. You may have to reboot after this change (it doesn't work otherwise on Mac OS X Server 10.4).

  2. Create a R/W DMG. It must be larger than the result will be. In this example, the bash variable "size" contains the size in Kb and the contents of the folder in the "source" bash variable will be copied into the DMG:

    hdiutil create -srcfolder "${source}" -volname "${title}" -fs HFS+ \
     -fsargs "-cc = 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) в папке с именем «.background» в DMG и сохраните его имя в переменной «backgroundPictureName».

  5. Используйте AppleScript для установки визуальных стилей (имя .app должно быть в переменной bash «applicationName», при необходимости используйте переменные для других свойств):

     echo '
     сообщить приложению "Finder"
     сказать диску "$ {title}"
     открыто
     установить текущий вид окна контейнера на вид значков
     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. Finialize the DMG by setting permissions properly, compressing and releasing it:

    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 
    

On Snow Leopard, the above applescript will not set the icon position correctly - it seems to be a Snow Leopard bug. One workaround is to simply call close/open after setting the icons, i.e.:

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open
194
ответ дан 23 November 2019 в 04:38
поделиться

Для тех из Вас, которые интересуются этой темой, я должен упомянуть, как я создаю 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
22
ответ дан Ludvig A. Norin 23 November 2019 в 04:38
поделиться

Не идите туда. Как долгосрочный разработчик Mac, я могу уверить Вас, никакое решение действительно не работает хорошо. Я попробовал столько решений, но они - все не слишком хорошие. Я думаю, что проблема состоит в том, что Apple действительно не документирует формат метаданных для необходимых данных.

Вот то, как я делаю его в течение долгого времени, очень успешно:

  1. Создают новый DMG, writeable(!), достаточно большой для содержания ожидаемых двоичных и дополнительных файлов как readme (редкий мог бы работать).

  2. Монтируют DMG и дают его, расположение вручную в Средстве поиска или с любыми инструментами подходит Вам для того, чтобы сделать это (см., что FileStorm связывается в нижней части для хорошего инструмента). Фоновое изображение обычно является изображением, которое мы помещаем в скрытую папку (" .something") на DMG. Поместите копию своего приложения там (любая версия, даже устаревший сделает). Скопируйте другие файлы (псевдонимы, readme, и т.д.) Вы хотите там, снова, устаревшие версии сделают очень хорошо. Удостоверьтесь, что значки имеют правильные размеры и положения (IOW, расположение DMG путем, Вы хотите, чтобы он был).

  3. Размонтирование DMG снова, все настройки должны быть сохранены к настоящему времени.

  4. Запись создавание сценария DMG, который работает следующим образом:

    • Это копирует DMG, таким образом, исходный никогда не затрагивается снова.
    • Это монтирует копию.
    • Это заменяет все файлы самыми актуальными (например, последним приложением после сборки). Можно просто использовать mv или так же для этого на командной строке. Отметьте при замене файла как этот значок останется таким же, положение останется таким же, все кроме файла (или каталог), содержание остается таким же (по крайней мере, с так же, который мы обычно используем для той задачи). Можно, конечно, также заменить фоновое изображение другим (просто удостоверяются, что оно имеет те же размеры).
    • После замены файлов, заставьте сценарий размонтировать копию DMG снова.
    • Наконец вызов hdiutil для преобразования перезаписываемого, к сжатому (и такой не перезаписываемый) DMG.

Этот метод не может звучать оптимальным, но доверять мне, он работает действительно хорошо на практике. Можно поместить исходный DMG (шаблон DMG) даже при управлении версиями (например, SVN), поэтому если Вы когда-нибудь случайно изменяетесь/уничтожаете его, можно просто вернуться к пересмотру, где это было все еще хорошо. Можно добавить шаблон DMG к проекту XCode, вместе со всеми другими файлами, которые принадлежат на DMG (readme, файл URL, фоновое изображение), все при управлении версиями и затем создают цель (например, внешняя цель, названная ", Создают DMG"), и там выполните сценарий DMG вышеупомянутых и добавьте старую основную цель как зависимую цель. Можно получить доступ к файлам в дереве XCode использование $ {SRCROOT} в сценарии (всегда исходный корень продукта), и можно получить доступ к продуктам сборки при помощи $ {BUILT_PRODUCTS_DIR} (всегда каталог, где XCode создает результаты сборки).

Результат: На самом деле XCode может произвести DMG в конце сборки. DMG, который готов выпустить. Не только можно создать повторно генерирование DMG, довольно легкого тот путь, можно на самом деле сделать так в автоматизированном процессе (на бездисплейном сервере, если Вам нравится), с помощью xcodebuild из командной строки (автоматизировал ночные сборки, например).

Относительно начального расположения шаблона, FileStorm является хорошим инструментом для того, чтобы сделать его. Это является коммерческим, но очень мощным и простым в использовании. Нормальная версия составляет меньше чем 20$, таким образом, это действительно доступно. Возможно, можно автоматизировать FileStorm для создания DMG (например, через AppleScript), никогда не пробовал это, но как только Вы нашли идеальный шаблон DMG, действительно легко обновить его для каждого выпуска.

37
ответ дан Mecki 23 November 2019 в 04:38
поделиться

Существует немного сценария Bash, названного , создают-dmg , который создает необычный DMGs с пользовательскими фонами, расположением пользовательского значка и именем тома.

я создал его много лет назад для компании, которую я выполнил в то время; это выживает на вкладе других людей с тех пор и по сообщениям работает хорошо.

существует также узел-appdmg , который похож на более современное и активное усилие на основе Node.js; проверьте его также.

55
ответ дан 6 revs, 3 users 79% 23 November 2019 в 04:38
поделиться

.DS_Store файлы хранят настройки Windows на Mac. Настройки Windows включают расположение значков, фон окна, размер окна и т. Д. Файл .DS_Store необходим при создании окна для подключенных изображений, чтобы сохранить расположение файлов и фон окна.

Создав файл .DS_Store, вы можете просто скопировать его в созданный установщик (DMG).

2
ответ дан 23 November 2019 в 04:38
поделиться

Мое приложение DropDMG - это простой способ создавать образы дисков с фоновыми изображениями, макетами значков, настраиваемыми значками тома и лицензионными соглашениями на программное обеспечение. Им можно управлять из системы сборки с помощью инструмента командной строки dropdmg или AppleScript. При желании RTF-файлы изображений и лицензий могут быть сохранены в вашей системе контроля версий.

13
ответ дан 23 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: