How to unpack and pack pkg file?

MacosPkg File

Macos Problem Overview


I have a pkg file created by Install Maker for Mac. I want to replace one file in pkg. But I must do this under Linux system, because this is a part of download process. When user starts to download file server must replace one file in pkg. I have a solution how unpack pkg and replace a file but I dont know how pack again to pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

Macos Solutions


Solution 1 - Macos

Packages are just .xar archives with a different extension and a specified file hierarchy. Unfortunately, part of that file hierarchy is a cpio.gz archive of the actual installables, and usually that's what you want to edit. And there's also a Bom file that includes information on the files inside that cpio archive, and a PackageInfo file that includes summary information.

If you really do just need to edit one of the info files, that's simple:

mkdir Foo
cd Foo
xar -xf ../Foo.pkg
# edit stuff
xar -cf ../Foo-new.pkg *

But if you need to edit the installable files:

mkdir Foo
cd Foo
xar -xf ../Foo.pkg
cd foo.pkg
cat Payload | gunzip -dc |cpio -i
# edit Foo.app/*
rm Payload
find ./Foo.app | cpio -o | gzip -c > Payload
mkbom Foo.app Bom # or edit Bom
# edit PackageInfo
rm -rf Foo.app
cd ..
xar -cf ../Foo-new.pkg

I believe you can get mkbom (and lsbom) for most linux distros. (If you can get ditto, that makes things even easier, but I'm not sure if that's nearly as ubiquitously available.)

Solution 2 - Macos

Here is a bash script inspired by abarnert's answer which will unpack a package named MyPackage.pkg into a subfolder named MyPackage_pkg and then open the folder in Finder.

	#!/usr/bin/env bash
	filename="$*"
	dirname="${filename/\./_}"
	pkgutil --expand "$filename" "$dirname"
	cd "$dirname"
	tar xvf Payload
	open .

Usage:

    pkg-upack.sh MyPackage.pkg

> Warning: This will not work in all cases, and will fail with certain files, e.g. the PKGs inside the OSX system installer. If you want to peek inside the pkg file and see what's inside, you can try SuspiciousPackage (free app), and if you need more options such as selectively unpacking specific files, then have a look at Pacifist (nagware).

Solution 3 - Macos

In addition to what @abarnert said, I today had to find out that the default cpio utility on Mountain Lion uses a different archive format per default (not sure which), even with the man page stating it would use the old cpio/odc format. So, if anyone stumbles upon the cpio read error: bad file format message while trying to install his/her manipulated packages, be sure to include the format in the re-pack step:

find ./Foo.app | cpio -o --format odc | gzip -c > Payload

Solution 4 - Macos

@shrx I've succeeded to unpack the BSD.pkg (part of the Yosemite installer) by using "pbzx" command.

pbzx <pkg> | cpio -idmu

The "pbzx" command can be downloaded from the following link:

Solution 5 - Macos

You might want to look into my fork of pbzx here: https://github.com/NiklasRosenstein/pbzx

It allows you to stream pbzx files that are not wrapped in a XAR archive. I've experienced this with recent XCode Command-Line Tools Disk Images (eg. 10.12 XCode 8).

pbzx -n Payload | cpio -i

Solution 6 - Macos

If you are experiencing errors during PKG installation following the accepted answer, I will give you another procedure that worked for me (please note the little changes to xar, cpio and mkbom commands):

mkdir Foo
cd Foo
xar -xf ../Foo.pkg
cd foo.pkg
cat Payload | gunzip -dc | cpio -i
# edit Foo.app/*
rm Payload
find ./Foo.app | cpio -o --format odc --owner 0:80 | gzip -c > Payload
mkbom -u 0 -g 80 Foo.app Bom # or edit Bom
# edit PackageInfo
rm -rf Foo.app
cd ..
xar --compression none -cf ../Foo-new.pkg

The resulted PKG will have no compression, cpio now uses odc format and specify the owner of the file as well as mkbom.

Solution 7 - Macos

Bash script to extract pkg: (Inspired by this answer:https://stackoverflow.com/a/23950738/16923394)

Save the following code to a file named pkg-upack.sh on the $HOME/Downloads folder

#!/usr/bin/env bash
    filename="$*"
    dirname="${filename/\./_}"
    mkdir "$dirname"
    # pkgutil --expand "$filename" "$dirname"
    xar -xf "$filename" -C "$dirname"
    cd "$dirname"/*.pkg
    pwd
    # tar xvf Payload
    cat Payload | gunzip -dc |cpio -i
    # cd usr/local/bin
    # pwd
    # ls -lt
    # cp -i * $HOME/Downloads/

Uncomment the last four lines, if you are using a rudix package.

Usage:

    cd $HOME/Downloads
    chmod +x ./pkg-upack.sh
    ./pkg-upack.sh MyPackage.pkg

This was tested with the ffmpeg and mawk package from rudix.org (https://rudix.org) search for ffmpeg and mawk packages on this site.

Source : My open source projects : https://sourceforge.net/u/nathan-sr/profile/

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondream2workView Question on Stackoverflow
Solution 1 - MacosabarnertView Answer on Stackoverflow
Solution 2 - MacosccpizzaView Answer on Stackoverflow
Solution 3 - MacosMalte RohdeView Answer on Stackoverflow
Solution 4 - Macosh6ah4iView Answer on Stackoverflow
Solution 5 - MacosNiklas RView Answer on Stackoverflow
Solution 6 - MacosJulian RiosView Answer on Stackoverflow
Solution 7 - MacosNathan SRView Answer on Stackoverflow