fix(dmg): ensure app bundle is visible with clean HFS+ layout

This commit is contained in:
Nikita 2026-10-07 10:29:54 +05:00
parent bb19925934
commit 76cb478235
2 changed files with 71 additions and 27 deletions

Binary file not shown.

View file

@ -6,53 +6,97 @@ APP_NAME="BLTS Tracker"
APP_BUNDLE="$DIR/$APP_NAME.app" APP_BUNDLE="$DIR/$APP_NAME.app"
DMG_NAME="BLTS-Tracker.dmg" DMG_NAME="BLTS-Tracker.dmg"
OUTPUT_DMG="$DIR/$DMG_NAME" OUTPUT_DMG="$DIR/$DMG_NAME"
STAGING_DIR="$DIR/.build/dmg_staging" VOL_NAME="$APP_NAME"
MOUNT_DIR="/Volumes/$VOL_NAME"
DMG_TMP="$DIR/.build/temp_rw.dmg"
echo "🚀 [1/4] Компиляция актуальной версии приложения..." echo "🚀 [1/5] Сборка актуальной версии приложения..."
"$DIR/build_app.sh" "$DIR/build_app.sh"
echo "📦 [2/4] Подготовка структуры DMG диска..." echo "🧹 [2/5] Подготовка и очистка атрибутов бандла..."
rm -rf "$STAGING_DIR" # Убеждаемся, что приложение не скрыто и не содержит чужих атрибутов
mkdir -p "$STAGING_DIR" xattr -cr "$APP_BUNDLE"
chflags -R nohidden "$APP_BUNDLE"
# Копируем .app в папку сборки
cp -R "$APP_BUNDLE" "$STAGING_DIR/"
# Создаем символическую ссылку на /Applications для Drag-and-Drop
ln -s /Applications "$STAGING_DIR/Applications"
# Устанавливаем иконку тома, если доступна
if [ -f "$DIR/AppIcon.icns" ]; then
cp "$DIR/AppIcon.icns" "$STAGING_DIR/.VolumeIcon.icns"
if command -v SetFile >/dev/null 2>&1; then if command -v SetFile >/dev/null 2>&1; then
SetFile -c icnC "$STAGING_DIR/.VolumeIcon.icns" 2>/dev/null || true SetFile -a B "$APP_BUNDLE" 2>/dev/null || true
SetFile -a C "$STAGING_DIR" 2>/dev/null || true SetFile -a v "$APP_BUNDLE" 2>/dev/null || true
fi
# Отмонтируем том, если он уже был примонтирован
hdiutil detach "$MOUNT_DIR" -force 2>/dev/null || true
rm -f "$DMG_TMP" "$OUTPUT_DMG"
mkdir -p "$DIR/.build"
echo "💿 [3/5] Создание временного HFS+ диска..."
hdiutil create -size 40m -fs HFS+ -volname "$VOL_NAME" -type UDIF "$DMG_TMP"
hdiutil attach "$DMG_TMP" -mountpoint "$MOUNT_DIR" -nobrowse
echo "📋 [4/5] Копирование приложения и настройка Finder..."
cp -R "$APP_BUNDLE" "$MOUNT_DIR/"
ln -s /Applications "$MOUNT_DIR/Applications"
# Сброс скрытых флагов внутри тома
xattr -cr "$MOUNT_DIR/$APP_NAME.app"
chflags -R nohidden "$MOUNT_DIR"
if command -v SetFile >/dev/null 2>&1; then
SetFile -a B "$MOUNT_DIR/$APP_NAME.app" 2>/dev/null || true
SetFile -a v "$MOUNT_DIR/$APP_NAME.app" 2>/dev/null || true
fi
# Установка иконки тома
if [ -f "$DIR/AppIcon.icns" ]; then
cp "$DIR/AppIcon.icns" "$MOUNT_DIR/.VolumeIcon.icns"
if command -v SetFile >/dev/null 2>&1; then
SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" 2>/dev/null || true
SetFile -a C "$MOUNT_DIR" 2>/dev/null || true
fi fi
fi fi
echo "💿 [3/4] Создание сжатого DMG образа ($DMG_NAME)..." # Настройка внешнего вида окна в Finder (AppleScript)
rm -f "$OUTPUT_DMG" osascript << APPLESCRIPT
tell application "Finder"
tell disk "$VOL_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 {300, 200, 840, 500}
set viewOptions to the icon view options of container window
set icon size of viewOptions to 100
set arrangement of viewOptions to not arranged
set position of item "$APP_NAME.app" of container window to {130, 140}
set position of item "Applications" of container window to {410, 140}
close
open
update without registering applications
delay 1
end tell
end tell
APPLESCRIPT
hdiutil create \ # Очистка кэшей Finder и корректное размонтирование
-volname "$APP_NAME" \ sync
-srcfolder "$STAGING_DIR" \ hdiutil detach "$MOUNT_DIR"
-ov \
-format UDZO \
-imagekey zlib-level=9 \
"$OUTPUT_DMG"
echo "🧹 [4/4] Очистка временных файлов..." echo "🗜️ [5/5] Финализация и сжатие в $DMG_NAME..."
rm -rf "$STAGING_DIR" hdiutil convert "$DMG_TMP" -format UDZO -imagekey zlib-level=9 -o "$OUTPUT_DMG"
rm -f "$DMG_TMP"
# Проверка готового образа
hdiutil attach "$OUTPUT_DMG" -mountpoint "$MOUNT_DIR" -nobrowse
ITEMS=$(osascript -e "tell application \"Finder\" to get name of every item of disk \"$VOL_NAME\"")
hdiutil detach "$MOUNT_DIR"
if [ -f "$OUTPUT_DMG" ]; then if [ -f "$OUTPUT_DMG" ]; then
DMG_SIZE=$(du -h "$OUTPUT_DMG" | cut -f1) DMG_SIZE=$(du -h "$OUTPUT_DMG" | cut -f1)
echo "" echo ""
echo "==================================================" echo "=================================================="
echo "🎉 Успешно создан DMG файл для установки!" echo "🎉 Успешно создан DMG файл!"
echo "📁 Путь: $OUTPUT_DMG" echo "📁 Файл: $OUTPUT_DMG"
echo "📊 Размер: $DMG_SIZE" echo "📊 Размер: $DMG_SIZE"
echo "🔍 Элементы в Finder: $ITEMS"
echo "==================================================" echo "=================================================="
else else
echo "❌ Ошибка: не удалось создать $OUTPUT_DMG" echo "❌ Ошибка при создании DMG"
exit 1 exit 1
fi fi