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
相关推荐
liupenglove1 小时前
Kibana8.17.0在mac上的安装
elasticsearch·macos·kibana
SoraLuna12 小时前
「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具
开发语言·macos·ui·华为·harmonyos
工业3D_大熊12 小时前
HOOPS Communicator功能剖析:3D Web模型树交互的实用指南!
linux·windows·macos·3d·docker·c#·.net
码农丁丁13 小时前
[前端]mac安装nvm(node.js)多版本管理
前端·macos·node.js·nvm
托尼沙滩裤13 小时前
【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南
运维·nginx·macos
chanTwo_0014 小时前
macOS brew安装
macos
Ansionnal17 小时前
mac编译ijkplayer遇到问题
macos
jinhuazhe201319 小时前
Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)
vue.js·windows·macos
弓弧名家_玄真君1 天前
mac 安装graalvm
macos