pkg文件介绍---ChatGPT 5 thinking作答
pkg.pkg。
·
什么是 .pkg 文件(详解)
.pkg 是“package(软件包)”的缩写,不同平台都会用到这个扩展名,但在日常开发与使用中最常见的是 macOS 的安装包。下面先重点讲 macOS 的 .pkg,再补充其他系统里 .pkg 的常见含义与差异。
一、macOS 的 .pkg 安装包
1) 用途与特点
- 用于安装系统级或多用户共享的组件(驱动、CLI 工具、框架、守护进程、Fonts、系统路径下的文件等)。
- 支持静默安装、MDM/企业级分发、签名与校验、脚本化(pre/post install)。
- 与
.dmg不同:.dmg是磁盘镜像(你通常在里面拖拽.app到 /Applications),.pkg是安装器,会把文件铺到系统各处(/usr/local、/Library、/Library/LaunchDaemons…)。
2) 内部结构(扁平包 / Flat Package)
现代 .pkg 通常是一个 XAR 容器,内部包含:
Distribution或PackageInfo(XML):描述安装逻辑、要求、脚本等。Payload:实际负载(一般是压缩的 cpio/pax 存档),即将被解压到目标系统路径的文件。Bom(Bill of Materials):安装清单(具体装了哪些文件、权限与位数等)。- 可能还有
Scripts:preinstall/postinstall等 Shell 脚本。
早期还存在“包式目录(bundle)”的
.pkg与.mpkg(多组件聚合包),如今更常见的是上述“扁平包”。
3) 如何安装
-
图形界面:双击
.pkg→ 跟随 Installer 向导。 -
命令行(可用于 CI/远程/MDM):
sudo installer -pkg YourApp.pkg -target /常用补充:
# 查看包信息(不安装) pkgutil --pkg-info com.yourcompany.yourpkg # 检查签名 pkgutil --check-signature YourApp.pkg # Gatekeeper 评估(是否被系统认可可安装) spctl --assess --type install YourApp.pkg
4) 安装记录(Receipts)
安装后会在 /var/db/receipts/ 生成两类记录文件:
com.yourcompany.yourpkg.plist(元数据)com.yourcompany.yourpkg.bom(清单)
查询已安装文件:
# 列出系统已知的所有包 ID
pkgutil --pkgs
# 查看某个包的文件列表(来自 receipt)
pkgutil --files com.yourcompany.yourpkg
# 更详细的 BOM 浏览
lsbom -l -f -s -pf /var/db/receipts/com.yourcompany.yourpkg.bom
注意:
pkgutil --forget com.yourcompany.yourpkg只会“遗忘”安装记录,不会删除已安装的文件。
5) 卸载方式
-
优先使用厂商提供的卸载器或卸载脚本。
-
否则可用
pkgutil --files/lsbom查出文件列表并谨慎逐一删除(注意不要误删共享依赖)。 -
最后可执行:
sudo pkgutil --forget com.yourcompany.yourpkg
6) 创建与签名(开发者视角)
构建基础组件包(两条常见路径):
-
方式 A:基于文件根目录
pkgbuild \ --root path/to/your_root \ --identifier com.yourcompany.yourpkg \ --version 1.0.0 \ --scripts path/to/scripts_dir \ YourAppComponent.pkg -
方式 B:基于
.app组件pkgbuild \ --component /Applications/YourApp.app \ --identifier com.yourcompany.yourpkg \ --version 1.0.0 \ YourAppComponent.pkg
将一个或多个组件包组合成可发布的“产品包”并附带分发规则(可选):
productbuild \
--distribution Distribution.xml \
--resources Resources \
--package-path . \
YourApp-Installer.pkg
为安装包签名(提升可信度,避免 Gatekeeper 阻拦):
productsign \
--sign "Developer ID Installer: Your Company (TEAMID)" \
YourApp-Installer-unsigned.pkg \
YourApp-Installer-signed.pkg
# 验证签名
pkgutil --check-signature YourApp-Installer-signed.pkg
公证(Notarization)与钉扎(Staple)(较新系统强烈建议):
# 提交公证(示例,实际请按你本机已配置的 Apple 工具与凭证)
xcrun notarytool submit YourApp-Installer-signed.pkg --apple-id <id> --team-id <team> --password <app-password> --wait
# 将公证票据“钉”到包里
xcrun stapler staple YourApp-Installer-signed.pkg
7) 常见问题处理
- “来自未识别开发者”:右键包 → 打开;或在“系统设置 → 隐私与安全性”里允许。企业分发应使用正确的 Developer ID Installer 证书+公证。
- “不兼容当前系统版本”:检查
Distribution/PackageInfo的最小系统要求;或包内脚本的系统版本判断。 - 静默/批量安装失败:确认
installer返回码与日志(/var/log/install.log),以及 pre/post 脚本权限与可执行性。
二、.pkg 在其他系统/生态里的含义(概览)
不同平台的
.pkg互不通用,格式和工具链都不一样。
- Solaris SVR4 / IPS:历史上使用
pkgadd等工具安装“软件包”,文件或数据流也常以“package”称呼,可能见到.pkg或相关载体。但现代 IPS 常见.p5p。 - FreeBSD(旧时代):早年也会看到
.pkg命名的打包产物;现代多用pkg工具管理.txz包,具体格式与 macOS.pkg不同。 - PlayStation 等游戏主机生态:
*.pkg作为游戏/内容分发包,与桌面操作系统无关。 - Linux 发行版:主流并不用
.pkg(常见为.deb/.rpm),但个别第三方可能自定义.pkg后缀的归档或安装脚本。
三、与 .dmg、.app、.zip 的选择对比(macOS)
| 场景 | 建议载体 | 说明 |
|---|---|---|
| 仅分发单个可拖拽安装的 GUI 应用 | .dmg(内含 .app 拖拽到 /Applications)或 .zip |
用户体验直观;不需要系统级脚本与权限。 |
| 需要安装到系统目录/注册守护/CLI/驱动 | .pkg |
可写入系统路径,带 pre/post 脚本,适合企业/MDM。 |
| 仅便携式工具 | .zip/独立压缩包 |
用户自行放置,无安装流程。 |
四、实用小抄(macOS)
- 安装包(GUI/CLI)
sudo installer -pkg X.pkg -target / - 查包 ID
pkgutil --pkgs | grep yourcompany - 查看包信息
pkgutil --pkg-info com.yourcompany.yourpkg - 查看安装的文件
pkgutil --files com.yourcompany.yourpkg - 查看/解析 BOM
lsbom -l -f -s -pf /var/db/receipts/com.yourcompany.yourpkg.bom - 忘记记录(不卸文件)
sudo pkgutil --forget com.yourcompany.yourpkg - 检查签名
pkgutil --check-signature X.pkg - 评估可安装性(Gatekeeper)
spctl --assess --type install X.pkg - 构建组件包
pkgbuild --root ROOT --identifier ID --version VER out.pkg - 组合与发布
productbuild --distribution Distribution.xml out.pkg - 签名/公证/钉扎
productsign/notarytool/stapler
更多推荐
所有评论(0)