我有一个由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
答案 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。