macos自动制作dmg安装包脚本

macos下,使用脚本制作dmg安装包脚本:

目录结构:

bash 复制代码
% tree helloworld/
test
|-- Applications -> /Applications
`-- Helloworld.app
    `-- Contents
        |-- Frameworks
        |   |-- QtCore.framework
        |   |   |-- QtCore -> Versions/Current/QtCore
        |   |   |-- Resources -> Versions/Current/Resources
        |   |   `-- Versions
        |   |       |-- 5
        |   |       |   |-- QtCore
        |   |       |   `-- Resources
        |   |       |       |-- Info.plist
        |   |       |       `-- QtCore.prl
        |   |       `-- Current -> 5
        |   |-- QtDBus.framework
        |   |   |-- QtDBus -> Versions/Current/QtDBus
        |   |   |-- Resources -> Versions/Current/Resources
        |   |   `-- Versions
        |   |       |-- 5
        |   |       |   |-- QtDBus
        |   |       |   `-- Resources
        |   |       |       |-- Info.plist
        |   |       |       `-- QtDBus.prl
        |   |       `-- Current -> 5
        |   |-- QtGui.framework
        |   |   |-- QtGui -> Versions/Current/QtGui
        |   |   |-- Resources -> Versions/Current/Resources
        |   |   `-- Versions
        |   |       |-- 5
        |   |       |   |-- QtGui
        |   |       |   `-- Resources
        |   |       |       |-- Info.plist
        |   |       |       `-- QtGui.prl
        |   |       `-- Current -> 5
        |   |-- QtNetwork.framework
        |   |   |-- QtNetwork -> Versions/Current/QtNetwork
        |   |   |-- Resources -> Versions/Current/Resources
        |   |   `-- Versions
        |   |       |-- 5
        |   |       |   |-- QtNetwork
        |   |       |   `-- Resources
        |   |       |       |-- Info.plist
        |   |       |       `-- QtNetwork.prl
        |   |       `-- Current -> 5
        |   |-- QtPrintSupport.framework
        |   |   |-- QtPrintSupport -> Versions/Current/QtPrintSupport
        |   |   |-- Resources -> Versions/Current/Resources
        |   |   `-- Versions
        |   |       |-- 5
        |   |       |   |-- QtPrintSupport
        |   |       |   `-- Resources
        |   |       |       |-- Info.plist
        |   |       |       `-- QtPrintSupport.prl
        |   |       `-- Current -> 5
        |   |-- QtSvg.framework
        |   |   |-- QtSvg -> Versions/Current/QtSvg
        |   |   |-- Resources -> Versions/Current/Resources
        |   |   `-- Versions
        |   |       |-- 5
        |   |       |   |-- QtSvg
        |   |       |   `-- Resources
        |   |       |       |-- Info.plist
        |   |       |       `-- QtSvg.prl
        |   |       `-- Current -> 5
        |   `-- QtWidgets.framework
        |       |-- QtWidgets -> Versions/Current/QtWidgets
        |       |-- Resources -> Versions/Current/Resources
        |       `-- Versions
        |           |-- 5
        |           |   |-- QtWidgets
        |           |   `-- Resources
        |           |       |-- Info.plist
        |           |       `-- QtWidgets.prl
        |           `-- Current -> 5
        |-- Info.plist
        |-- MacOS
        |   |-- HelloworldUI
        |   `-- HelloworldService
        |-- PlugIns
        |   |-- bearer
        |   |   `-- libqgenericbearer.dylib
        |   |-- iconengines
        |   |   `-- libqsvgicon.dylib
        |   |-- imageformats
        |   |   |-- libqgif.dylib
        |   |   |-- libqicns.dylib
        |   |   |-- libqico.dylib
        |   |   |-- libqjpeg.dylib
        |   |   |-- libqmacheif.dylib
        |   |   |-- libqmacjp2.dylib
        |   |   |-- libqtga.dylib
        |   |   |-- libqtiff.dylib
        |   |   |-- libqwbmp.dylib
        |   |   `-- libqwebp.dylib
        |   |-- platforms
        |   |   `-- libqcocoa.dylib
        |   |-- printsupport
        |   |   `-- libcocoaprintersupport.dylib
        |   `-- styles
        |       `-- libqmacstyle.dylib
        `-- Resources
            |-- AppCtrl.json
            |-- AppIcon.icns
            |-- font
            |   |-- Alibaba-PuHuiTi-Medium.otf
            |   `-- Alibaba-PuHuiTi-Regular.otf
            |-- auth
            |   |-- auth.html
            |   `-- images
            |       |-- error.png
            |       `-- logo.png
            |-- ui
            |   |-- images
            |   |   |-- search.png
            |   |   `-- warning.png
            |   |-- ui.css
            |   |-- ui.html
            |   |-- ui.js
            |   `-- ui_header.html
            `-- resourceList
                |-- images
                |   |-- logo.png
                |   `-- user.png
                `-- resource_list.html

制作dmg脚本:

bash 复制代码
#!/usr/bin/env python3
import os
import subprocess
import sys
import argparse

def extract_dmg(dmg_path, output_dir):
    """Extracts the contents of a DMG file to a specified output directory."""
    # Create the output directory if it doesn't exist
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # Mount the DMG file
    mount_point = "/Volumes/dmg_tool_mount"
    subprocess.run(["hdiutil", "attach", dmg_path, "-mountpoint", mount_point], check=True)

    # Copy contents to the output directory
    try:
        subprocess.run(["cp", "-R", f"{mount_point}/.", output_dir], check=True)
    finally:
        # Unmount the DMG file
        subprocess.run(["hdiutil", "detach", mount_point], check=True)

    print(f"Extracted {dmg_path} to {output_dir}")

def create_dmg(source_dir, dmg_output):
    """Creates a DMG file from the specified source directory."""
    # Create the DMG file
    subprocess.run(["hdiutil", "create", dmg_output, "-srcfolder", source_dir, "-ov"], check=True)
    print(f"Created DMG {dmg_output} from {source_dir}")

def main():
    parser = argparse.ArgumentParser(description="Extract or create DMG files.")
    subparsers = parser.add_subparsers(dest='command')

    # Subparser for extracting
    extract_parser = subparsers.add_parser('extract', help='Extract a DMG file')
    extract_parser.add_argument('dmg', help='Path to the DMG file')
    extract_parser.add_argument('output', help='Directory to extract to')

    # Subparser for creating
    create_parser = subparsers.add_parser('create', help='Create a DMG file from a directory')
    create_parser.add_argument('source', help='Directory to create DMG from')
    create_parser.add_argument('dmg', help='Output path for the DMG file')

    args = parser.parse_args()

    if args.command == 'extract':
        extract_dmg(args.dmg, args.output)
    elif args.command == 'create':
        create_dmg(args.source, args.dmg)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

测试:

bash 复制代码
抽取Helloworld.dmg中的文件到test目录:
 % ./dmg_tool.py extrace Helloworld.dmg test
 % ls test
Applications    Helloworld.app
使用test目录下的文件,重新制作dmg文件为Helloworld2.dmg:
% ./dmg_tool.py create test Helloworld2.dmg
% ls Helloworld2.dmg
相关推荐
尽兴-8 小时前
如何将多个.sql文件合并成一个:Windows和Linux/Mac详细指南
linux·数据库·windows·sql·macos
诗句藏于尽头8 小时前
Mac关闭触控板
macos
笑衬人心。8 小时前
在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
java·macos·intellij-idea
csdn_aspnet8 小时前
在 MacOS 上安装和配置 Kafka
macos·kafka
screenCui9 小时前
macOS运行python程序遇libiomp5.dylib库冲突错误解决方案
开发语言·python·macos
东东旭huster10 小时前
Mac自定义右键功能
macos
路先生的杂货铺15 小时前
mac m1芯片 安装pd及win10系统
macos
goodmao15 小时前
【macOS】【Swift】【RTF】黑色文字在macOS深色外观下看不清的解决方法
macos
liliangcsdn17 小时前
在mac m1基于llama.cpp运行deepseek
人工智能·macos·语言模型·llama
silence25017 小时前
macOS 上安装 Miniconda + Conda-Forge
macos·conda