macos自动制作dmg安装包脚本

news/2024/12/24 11:23:11/

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

目录结构:

% 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脚本:

#!/usr/bin/env python3
import os
import subprocess
import sys
import argparsedef 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 existif not os.path.exists(output_dir):os.makedirs(output_dir)# Mount the DMG filemount_point = "/Volumes/dmg_tool_mount"subprocess.run(["hdiutil", "attach", dmg_path, "-mountpoint", mount_point], check=True)# Copy contents to the output directorytry:subprocess.run(["cp", "-R", f"{mount_point}/.", output_dir], check=True)finally:# Unmount the DMG filesubprocess.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 filesubprocess.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 extractingextract_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 creatingcreate_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()

测试:

抽取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

http://www.ppmy.cn/news/1557723.html

相关文章

WPS工具栏灰色怎么办

WPS离线不登录,开启工具栏等相关功能 当你在使用WPS的过程中,若因网络问题或其他特殊原因,导致无法登录使用WPS时,可根据以下步骤开启离线兼容模式,开启此模式后,可在未登录的状态下,激活并使用…

Java重要面试名词整理(三):并发编程(上)

文章目录 并发编程基础概念线程&进程进程线程进程&线程区别总结进程间的通信[面试热点]CPU核心数和线程数的关系 上下文切换(Context switch)**并行和并发** Java里的线程启动**Thread** **和** **Runnable** **的区别****Callable** **、Future…

Android Bootable Recovery 中的 `bspatch.cpp` 文件详解

Android Bootable Recovery 中的 bspatch.cpp 文件详解 引言 在 Android 系统中,Recovery 模式是一个非常重要的组件,它允许用户在设备启动时执行一系列的维护操作,例如系统更新、数据擦除、备份和恢复等。Android Bootable Recovery 的核心功能之一是处理增量更新(Delta…

Java实现贪吃蛇游戏

目录 一、项目结构 二、实现步骤 1. 创建 Snake 类 2. 创建 Food 类 3. 创建 GameBoard 类 4. 创建 SnakeGame 类 三、总结 贪吃蛇是一个经典的电子游戏,它的玩法非常简单,但又充满了挑战。玩家通过控制蛇的移动,吃到食物并不断成长&a…

云技术基础知识(二):虚拟化与容器技术

内容预览 ≧∀≦ゞ 虚拟化与容器技术虚拟化技术一、虚拟化的核心概念二、虚拟化的主要类型1. 服务器虚拟化2. 操作系统虚拟化(容器化)3. 网络虚拟化4. 存储虚拟化 三、虚拟化的实现方法和工具1. 服务器虚拟化实现2. 操作系统虚拟化(容器化&am…

最新雷蛇鼠标键盘驱动Razer Synapse 4(雷云) 下载与安装

雷蛇最近更新了驱动程序,Razer Synapse 4(雷云) 拥有全新的多线程架构,速度提高了 30%*。通过简化的界面体验无与伦比的速度、流畅性和稳定性,使用户能够快速导航,实现独立安装和精确设置配置。 更新一&am…

gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘

首次克隆仓库,失效了,上网查方法,都说是网络代理的问题,各种清理网络代理后都无效,去问同事: 先前都是直接复制的网页url当做远端url,或者点击按钮‘使用http克隆’ 这次对于我来说有效的远端u…

使用FreeNAS软件部署ISCSI的SAN架构存储(IP-SAN)练习题

一,实验用到工具分别为: VMware虚拟机,安装教程:VMware Workstation Pro 17 安装图文教程 FreeNAS系统,安装教程:FreeNAS-11.2-U4.1安装教程2024(图文教程) 二,新建虚…