macos自动制作dmg安装包脚本

ops/2024/12/26 0:27:08/

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/ops/144973.html

相关文章

【JetPack】Navigation知识点总结

Navigation的主要元素&#xff1a; 1、Navigation Graph&#xff1a; 一种新的XML资源文件,包含应用程序所有的页面&#xff0c;以及页面间的关系。 <?xml version"1.0" encoding"utf-8"?> <navigation xmlns:android"http://schemas.a…

MySQL什么情况下会导致索引失效

MySQL什么情况下会导致索引失效 索引&#xff08;Index&#xff09;是数据库中一种用于快速查找和访问表中数据的结构&#xff0c;它类似于书的目录&#xff0c;通过索引可以快速定位到目标数据&#xff0c;而无需遍历整个表&#xff0c;索引的存在可以显著提高查询速度&#x…

[工具]GitHub Copilot 直接提供免费额度了

有福了&#xff01; GitHub Copilot 直接提供免费额度——每个月享 2000个代码提示完成额度&#xff08;每个工作日大约80个&#xff09;&#xff0c;以及 50个聊天请求。后台是访问 GPT-4o 和 Claude 3.5 Sonnet 模型。 插件支持VS Code、VS 2022、JetBrains、... 这下 Curs…

Java 重写(Override)与重载(Overload)

重写 (Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写&#xff01;返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。…

【漏洞复现】CVE-2021-45788 SQL Injection

漏洞信息 NVD - cve-2021-45788 Time-based SQL Injection vulnerabilities were found in Metersphere v1.15.4 via the “orders” parameter. Authenticated users can control the parameters in the “order by” statement, which causing SQL injection. API: /test…

前端对页面数据进行缓存

页面录入信息&#xff0c;退出且未提交状态下&#xff0c;前端对页面数据进行存储 前端做缓存&#xff0c;一般放在local、session和cookies里面&#xff0c;但是都有大小限制&#xff0c;如果页面东西多&#xff0c;比如有上传的图片、视频&#xff0c;浏览器会抛出一个Quota…

【AIStarter:项目管理平台】Krita 5.2.6 + AI 1.29 + ComfyUI 插件:创作与效率的完美结合

引言 在数字艺术创作的世界里&#xff0c;工具的选择往往决定了作品的质量和创作的效率。对于追求高效与便捷的艺术家们来说&#xff0c;Krita 5.2.6、AI 1.29 和 ComfyUI 插件的组合无疑是一套理想的解决方案。这套集成了最新技术的软件套装&#xff0c;不仅提供了强大的绘图…

用友-友数聚科技CPAS审计管理系统V4 downPlugs存在任意文件下载漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…