Как распаковать и упаковать файл pkg?
У меня есть файл pkg, созданный Install Maker для Mac.
Я хочу заменить один файл в pkg. Но я должен сделать это в системе Linux, потому что это часть процесса загрузки. Когда пользователь начинает скачивать файл сервер должен заменить один файл в pkg.
У меня есть решение как распаковать pkg и заменить файл, но я не знаю, как упаковать снова в pkg.
http://emresaglam.com/blog/1035
http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html
5 ответов:
пакеты просто .архивы xar с другим расширением и заданной иерархией файлов. К сожалению, частью этой файловой иерархии является cpio.GZ архив фактических установочных файлов, и обычно это то, что вы хотите отредактировать. И есть также файл спецификации, который включает информацию о файлах внутри этого архива 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Я считаю, что вы можете получить mkbom (и lsbom) для большинства дистрибутивов linux. (Если вы можете получить то же самое, это делает вещи еще проще, но я не уверен, что это почти так же повсеместно доступно.)
вдохновленный ответом от 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предупреждение: это не будет работать во всех случаях, и не будет работать с некоторыми файлами, например PKGs внутри установщика системы OSX. Если вы просто хотите заглянуть внутрь файла pkg и посмотреть, что внутри, вы можете попробовать подозрительный пакет (бесплатное приложение), и если вы хотите сделать некоторые серьезные распаковки, в том числе извлечение отдельных файлов, то обратите внимание на пацифист (nagware).
В дополнение к тому, что сказал @abarnert, мне сегодня пришлось узнать, что по умолчанию
cpioутилита на Mountain Lion использует другой формат архива по умолчанию (не уверен, какой), даже с man-страницей, заявляющей, что она будет использовать старый формат cpio/odc. Так что, если кто-то наткнется наcpio read error: bad file formatсообщение при попытке установить его / ее манипулируемые пакеты, не забудьте включить формат в шаге повторной упаковки:find ./Foo.app | cpio -o --format odc | gzip -c > Payload
@shrx мне удалось распаковать BSD.pkg (часть установщика Yosemite) с помощью команды "pbzx".
pbzx <pkg> | cpio -idmuкоманду" pbzx " можно скачать по следующей ссылке:
возможно, вы захотите заглянуть в мой форк
pbzxздесь:https://github.com/NiklasRosenstein/pbzxОн позволяет передавать файлы pbzx, которые не завернуты в архив XAR. Я испытал это с недавними образами дисков инструментов командной строки XCode (например. 10.12 XCode 8).
pbzx -n Payload | cpio -i
Comments