什么是 .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 容器,内部包含:

  • DistributionPackageInfo(XML):描述安装逻辑、要求、脚本等。
  • Payload:实际负载(一般是压缩的 cpio/pax 存档),即将被解压到目标系统路径的文件。
  • Bom(Bill of Materials):安装清单(具体装了哪些文件、权限与位数等)。
  • 可能还有 Scriptspreinstall / 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

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐