Как распаковать и упаковать файл 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

903   5  

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

    Ничего не найдено.