У меня есть файл 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Как распаковать и упаковать файл pkg?
ответ
Пакеты просто .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
Я считаю, что вы можете получить mkbom (и lsbom) для большинства дистрибутивов linux. (Если вы можете получить то же самое, это упростит ситуацию, но я не уверен, что это почти повсеместно доступно.)
Да. Я пробовал этот метод раньше (только распаковать/упаковать без изменения каких-либо файлов), но после установки этого pkg ничего не произошло. В консоли я получил это сообщение: posix_spawn ("/ Library/Application Support/Project1/Project1.app/Contents/MacOS/Project1", ...): Нет такого файла или каталога. Я исследовал, что старый файл полезной нагрузки имеет /./ Project1.app/... и новая полезная нагрузка имеет /Project1.app/... внутри. – dream2work
Ну, эта последняя часть проста. Я не знаю, имеет ли это значение, но может (возможно, потому, что Bom и полезная нагрузка не совпадают?). Просто используйте ./Foo.app вместо Foo.app в команде find | cpio | gzip. Я отредактирую ответ. – abarnert
@abarnert: вместо 'cat полезной нагрузки | gunzip -dc | cpio -i' вы могли бы просто использовать «tar xzvf Payload» – ccpizza
В дополнение к тому, что сказал @abarnert, мне сегодня нужно было выяснить, что утилита cpio
по умолчанию на Mountain Lion используется другой формат архива по умолчанию (не уверен, какой), даже с man-страницей, в которой он будет использовать старый формат cpio/odc. Так что, если кто-нибудь натыкается на cpio read error: bad file format
сообщениях при попытке установить его/ее манипулируют пакеты, не забудьте включить формат на этапе повторной упаковки:
find ./Foo.app | cpio -o --format odc | gzip -c > Payload
Вдохновленного ответ от abarnert, я сделал Баш скрипт, который распакует пакет с именем 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
Внимание: Это не будет работать во всех случаях, и не сможет с некоторыми файлами, например, PKG внутри установщика системы OSX. Если вы просто хотите заглянуть внутрь файла pkg и посмотреть, что внутри, вы можете попробовать SuspiciousPackage (бесплатное приложение), и если вы хотите сделать серьезную распаковку, включая извлечение определенных файлов, посмотрите на Pacifist (nagware).
@shrx Мне удалось распаковать BSD.pkg (часть установщика Yosemite) с помощью команды «pbzx».
Команда "pbzx" можно скачать по следующей ссылке:
Вы могли бы хотеть смотреть в мою развилки pbzx
здесь: https://github.com/NiklasRosenstein/pbzx
Он позволяет вам передавать файлы pbzx, которые не являются wra pped в архиве XAR. Я испытал это с помощью недавно созданных XCode инструментов командной строки Disk Images (например, 10.12 XCode 8).
pbzx -n Payload | cpio -i
(Для будущих посетителей) http://gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10/ может дать вам представление о –
MacOS, кажется, пришел с командой Xar , – MikeP