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