fix(dmg): ensure app bundle is visible with clean HFS+ layout
This commit is contained in:
parent
bb19925934
commit
76cb478235
2 changed files with 71 additions and 27 deletions
BIN
BLTS-Tracker.dmg
BIN
BLTS-Tracker.dmg
Binary file not shown.
|
|
@ -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"
|
||||||
|
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
|
echo "💿 [3/5] Создание временного HFS+ диска..."
|
||||||
ln -s /Applications "$STAGING_DIR/Applications"
|
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
|
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
|
if command -v SetFile >/dev/null 2>&1; then
|
||||||
SetFile -c icnC "$STAGING_DIR/.VolumeIcon.icns" 2>/dev/null || true
|
SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" 2>/dev/null || true
|
||||||
SetFile -a C "$STAGING_DIR" 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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue