macos自动制作dmg安装包脚本

embedded/2024/12/25 12:20:02/

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/embedded/148612.html

相关文章

C++实战:手撕类似于vector的容器(逆序算法、排序算法等)

文章目录速览 1、使用C泛型编程实现类似于vector的容器类ArrContainer 1、使用C泛型编程实现类似于vector的容器类ArrContainer 直接上代码&#xff1a;可作读者参考 #pragma once #include <exception> template<typename T> class ArrContainer { private:T* m…

我的JAVA-Web基础(2)

1.JDBC 防止sql注入 2.JSP JSP的基本语法 基本语法是 <% %> Java代码 <% %> 输出变量 可以转换成${变量}的EL表达式 <%! %>定义变量 JSP的基本语法包括以下几个主要部分&#xff1a; 1. 表达式&#xff08;Expression&#xff09; 表达式用于将…

leetcode hot100相交链表

160. 相交链表 已解答 简单 相关标签 相关企业 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null # Definition for singly-linked list. # class ListNode(object): # …

机器学习-KMeans聚类

文章目录 KMeans聚类图像分割社交网络分析和推荐系统具体流程 效果和作用 KMeans聚类 图像分割 像素点分为不同的聚类&#xff08;特征值相似度高的就是一堆聚类&#xff09; 社交网络分析和推荐系统 依然是根据特征&#xff0c;不同对象不同的表达特征形式也不一样 具体流…

SSE(Server-Sent Events)返回n ,前端接收数据时被错误的截断【如何避免SSE消息中的换行符或回车符被解释为事件消息的结束】

一.问题背景 前后端分离项目&#xff0c;前端使用angular框架&#xff0c;后端使用springboot框架。后端使用spring-boot-starter-webflux【后面会专门出一期文章详解】提供流式接口&#xff0c;前端使用sse.js【后面会专门出一期文章详解】调用后端接口。 二.问题描述 后端…

支付宝订单码支付

1.订单码支付&#xff0c;首先下载官方网站提供的sdk包到你的项目中。 2.选择控制器复制官方文档的获取二维码相关的代码示例。打开sdk包中v2的index.php文件&#xff0c;这个才是你选择语言的具体代码。 3.引用里面所需要的类文件&#xff0c;文件下载到你的项目中后&#xf…

网络下载ts流媒体

网络下载ts流媒体 查看下载排序合并 很多视频网站&#xff0c;尤其是微信小程序中的长视频无法获取到准确视频地址&#xff0c;只能抓取到.ts片段地址&#xff0c;下载后发现基本都是5~8秒时长。 例如&#xff1a; 我们需要将以上地址片段全部下载后排序后再合成新的长视频。 …

Redis——缓存雪崩

文章目录 1. 问题介绍2. 解决方案2.1 方案一&#xff1a;随机过期时间2.2 方案二&#xff1a;增强 Redis 集群的可用性2.3 方案三&#xff1a;多级缓存2.3.1 做法2.3.2 流程2.3.3 示例代码2.3.4 评价 2.4 方案四&#xff1a;限流 3. 总结 1. 问题介绍 缓存雪崩&#xff1a;大量…