Distribution packages are a special format of installer packages. Distribution packages can contain one or more normal or component packages. They can also contain extra resources to customize and control the user interface in the Installer application.
In most cases administrators prefer component packages since they are easier to create and maintain. However, there are a few cases where distribution packages are necessary:
- add a package to a custom installation in NetInstall, AutoDMG or a system installer created with createOSXinstallPkg
- combine multiple component pkgs into a single installer
- restrict hardware and system requirements
- modify the interface presented in Installer.app
- push the package with MDM’s
Building Distribution Packages
You can easily convert an existing component package, built with
pkgbuild to a distribution package with the
$ productbuild --package component.pkg dist.pkg
You can also combine multiple components into a single distribution package:
$ productbuild --package A.pkg --package B.pkg combined.pkg
You can add the
--sign option to the
productbuild command when the distribution package needs to be signed:
$ productbuild --sign "Installer: Armin" --package component.pkg dist.pkg
You can find valid identities with
$ security find-identity -p basic -v
The string you pass with the
--sign parameter can be a partial match to the full identity name.
munkipkghas a flag to build a distribitution package instead of a component package.
Extracting Component Installers from Distribution Packages
Sometimes you may want to extract a component installer pkg from a distribution package.
First you need to expand the distribution pkg with
$ pkgutil --expand dist.pkg dist_expanded
When you use the
--expand option on a distribution package, components will also be expanded into subfolders that end in
.pkg. Because of this Finder will erroneously display them as installer bundle files. This is misleading, since the components are not functional in this form.
When you want to use the component package without any modifications, you can quickly recompress or ‘flatten’ the expanded component:
$ pkgutil --flatten dist_expanded/component.pkg component.pkg
The process of expanding and flattening a component will of course remove any signature the original pkg might have had. You can re-sign the flattened package with
$ productsign --sign "Installer: Armin" component.pkg component_signed.pkg
Note: Obviously, when you are tearing a distribution package apart you need to know what you are doing. Components in a distribution package may depend on other components or on scripts and tools in other components. As always: test, test, test.
You can learn more on building installer packages in my book: “Packaging for Apple Administrators”