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
相关推荐
皮卡车厘子1 天前
Mac 挂载目录
macos
良逍Ai出海1 天前
在 Windows & macOS 上安装 Claude Code,并使用第三方 Key 的完整教程
windows·macos
热爱生活的五柒1 天前
linux/mac/wsl如何使用claude code,并配置免费的硅基流动API?(官方的需要付费订阅)
linux·运维·macos
胖胖大王叫我来巡山1 天前
mac本地安装DataEase桌面版
macos
奋斗者1号1 天前
OpenClaw 部署方式对比:云端、WSL、Mac 本机、Ubuntu 虚拟机(2026年2月最新主流实践)
linux·ubuntu·macos
玉梅小洋1 天前
Android SDK 安装指南(MacOS 和 Windows)
android·windows·macos·sdk
2501_916007471 天前
没有 Mac 用户如何上架 App Store,IPA生成、证书与描述文件管理、跨平台上传
android·macos·ios·小程序·uni-app·iphone·webview
胖胖大王叫我来巡山1 天前
Mac通过源码安装部署SQLBOT
macos
June bug2 天前
【领域知识】广告全链路测试
macos·objective-c·cocoa
作孽就得先起床2 天前
Xcode设置中文
macos