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"
DMG_NAME="BLTS-Tracker.dmg"
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"
echo "📦 [2/4] Подготовка структуры DMG диска..."
rm -rf "$STAGING_DIR"
mkdir -p "$STAGING_DIR"
echo "🧹 [2/5] Подготовка и очистка атрибутов бандла..."
# Убеждаемся, что приложение не скрыто и не содержит чужих атрибутов
xattr -cr "$APP_BUNDLE"
chflags -R nohidden "$APP_BUNDLE"
if command -v SetFile >/dev/null 2>&1; then
SetFile -a B "$APP_BUNDLE" 2>/dev/null || true
SetFile -a v "$APP_BUNDLE" 2>/dev/null || true
fi
# Копируем .app в папку сборки
cp -R "$APP_BUNDLE" "$STAGING_DIR/"
# Отмонтируем том, если он уже был примонтирован
hdiutil detach "$MOUNT_DIR" -force 2>/dev/null || true
rm -f "$DMG_TMP" "$OUTPUT_DMG"
mkdir -p "$DIR/.build"
# Создаем символическую ссылку на /Applications для Drag-and-Drop
ln -s /Applications "$STAGING_DIR/Applications"
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" "$STAGING_DIR/.VolumeIcon.icns"
cp "$DIR/AppIcon.icns" "$MOUNT_DIR/.VolumeIcon.icns"
if command -v SetFile >/dev/null 2>&1; then
SetFile -c icnC "$STAGING_DIR/.VolumeIcon.icns" 2>/dev/null || true
SetFile -a C "$STAGING_DIR" 2>/dev/null || true
SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" 2>/dev/null || true
SetFile -a C "$MOUNT_DIR" 2>/dev/null || true
fi
fi
echo "💿 [3/4] Создание сжатого DMG образа ($DMG_NAME)..."
rm -f "$OUTPUT_DMG"
# Настройка внешнего вида окна в Finder (AppleScript)
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 \
-volname "$APP_NAME" \
-srcfolder "$STAGING_DIR" \
-ov \
-format UDZO \
-imagekey zlib-level=9 \
"$OUTPUT_DMG"
# Очистка кэшей Finder и корректное размонтирование
sync
hdiutil detach "$MOUNT_DIR"
echo "🧹 [4/4] Очистка временных файлов..."
rm -rf "$STAGING_DIR"
echo "🗜️ [5/5] Финализация и сжатие в $DMG_NAME..."
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
DMG_SIZE=$(du -h "$OUTPUT_DMG" | cut -f1)
echo ""
echo "=================================================="
echo "🎉 Успешно создан DMG файл для установки!"
echo "📁 Путь: $OUTPUT_DMG"
echo "🎉 Успешно создан DMG файл!"
echo "📁 Файл: $OUTPUT_DMG"
echo "📊 Размер: $DMG_SIZE"
echo "🔍 Элементы в Finder: $ITEMS"
echo "=================================================="
else
echo "❌ Ошибка: не удалось создать $OUTPUT_DMG"
echo "❌ Ошибка при создании DMG"
exit 1
fi