如何解压缩和打包pkg文件?

时间:2012-07-02 18:06:22

标签: macos pkg-file

我有一个由Install Maker for Mac创建的pkg文件。 我想用pkg替换一个文件。但我必须在Linux系统下这样做,因为这是下载过程的一部分。当用户开始下载文件服务器时必须用pkg替换一个文件。 我有一个解决方案如何解压缩pkg并更换文件,但我不知道如何再次打包到pkg。 http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

6 个答案:

答案 0 :(得分:165)

包只是.xar存档,具有不同的扩展名和指定的文件层次结构。不幸的是,该文件层次结构的一部分是实际可安装程序的cpio.gz存档,通常这就是您要编辑的内容。还有一个Bom文件,其中包含有关该cpio存档内文件的信息,以及一个包含摘要信息的PackageInfo文件。

如果你真的需要编辑其中一个信息文件,那很简单:

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

但是如果你需要编辑可安装文件:

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

我相信你可以为大多数Linux发行版获得mkbom(和lsbom)。 (如果你可以同上,那会让事情变得更容易,但我不确定这是否几乎无处不在。)

答案 1 :(得分:17)

受到abarnert答案的启发,我创建了一个bash脚本,将名为MyPackage.pkg的包解压缩到名为MyPackage_pkg的子文件夹中,然后在Finder中打开该文件夹。如果您不想使用Finder步骤,请删除最后一行。

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

用法:

    pkg-upack.sh MyPackage.pkg
  

警告:这不会在所有情况下都有效,并且会因某些文件而失败,例如: OSX系统安装程序中的PKG。如果您只想查看pkg文件并查看其中的内容,可以尝试SuspiciousPackage(免费应用),如果您想进行一些严格的解包,包括提取特定文件,请查看{{ 3}}(nagware)。

答案 2 :(得分:3)

除了@abarnert所说的,我今天必须发现Mountain Lion上的默认cpio实用程序默认使用不同的归档格式(不确定哪个),即使手册页说明它也会使用旧的cpio / odc格式。因此,如果有人在尝试安装他/她操作的软件包时偶然发现cpio read error: bad file format消息,请务必在重新打包步骤中包含该格式:

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

答案 3 :(得分:3)

@shrx我已成功使用“pbzx”命令解压缩BSD.pkg(Yosemite安装程序的一部分)。

pbzx <pkg> | cpio -idmu

可以从以下链接下载“pbzx”命令:

答案 4 :(得分:2)

您可能需要在pbzx pbzx -n Payload | cpio -i 点击我的分支:https://github.com/NiklasRosenstein/pbzx

它允许您流式传输未包含在XAR存档中的pbzx文件。我用最新的XCode命令行工具磁盘映像(例如10.12 XCode 8)体验过这一点。

getModel('JVMUtils@cbcommons')

答案 5 :(得分:0)

如果您在接受接受的答案后在 PKG 安装过程中遇到错误,我会给您另一个对我有用的程序(请注意 xar、cpio 和 mkbom 命令的小改动):

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

生成的 PKG 将没有压缩,cpio 现在使用 odc 格式并指定文件的所有者以及 mkbom。