2012-07-02 30 views
71

Mam plik pkg stworzony przez Install Maker for Mac. Chcę zamienić jeden plik w pkg. Ale muszę to zrobić w systemie Linux, ponieważ jest to część procesu pobierania. Gdy użytkownik zaczyna pobierać serwer plików, musi zastąpić jeden plik w pkg. Mam rozwiązanie, jak rozpakować pkg i zastąpić plik, ale nie wiem, jak pakiet ponownie do pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.htmlJak rozpakować i spakować plik pkg?

+0

(Dla przyszłych użytkowników) http://gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10/ może dać wgląd –

+0

MacOS wydaje się pochodzić z poleceniem XAR . – MikeP

Odpowiedz

137

Pakiety są tylko xar archiwów z innym rozszerzeniem i określonej hierarchii plików. Niestety, częścią tej hierarchii plików jest archiwum cpio.gz rzeczywistych instalacji i zwykle to właśnie chcemy edytować. Istnieje również plik Bom zawierający informacje o plikach znajdujących się w archiwum cpio oraz plik PackageInfo zawierający informacje podsumowujące.

Jeśli naprawdę nie wystarczy zmienić jeden z plików info, że jest prosta:

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

Ale jeśli trzeba edytować instalowalnych pliki:

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 

Wierzę, że można dostać mkbom (i lsbom) dla większości dystrybucji Linuksa. (Jeśli możesz zrobić to samo, to jest jeszcze łatwiejsze, ale nie jestem pewien, czy jest to prawie tak wszechobecne).

+0

Tak. Próbowałem tej metody wcześniej (tylko rozpakować/pack bez zmiany jakichkolwiek plików), ale po zainstalowaniu tego pkg nic się nie stało. W konsoli dostałem tę wiadomość: posix_spawn ("/ Library/Application Support/Project1/Project1.app/Contents/MacOS/Project1", ...): Brak takiego pliku lub katalogu. Sprawdziłem, że stary plik ładunku ma /./ Project1.app/... i nowy ładunek ma /Project1.app/... wewnątrz. – dream2work

+0

Cóż, ta ostatnia część jest łatwa. Nie wiem, czy to robi różnicę, ale może (może dlatego, że Bom i ładunek się nie zgadzają?). Po prostu użyj ./Foo.app zamiast Foo.app w poleceniu find | cpio | gzip. Będę edytować odpowiedź. – abarnert

+3

@abarnert: zamiast 'cat Ładunek | gunzip -dc | cpio -i' możesz po prostu użyć 'tar xzvf Payload' – ccpizza

3

Oprócz tego, co powiedział @abarnert, musiałem dzisiaj dowiedzieć się, że domyślne narzędzie cpio on Mountain Lion używa domyślnie innego formatu archiwum (nie wiem, który), nawet jeśli strona podręcznika mówi, że używa starego formatu cpio/odc. Tak więc, jeśli ktoś potyka się na komunikacie cpio read error: bad file format podczas próby zainstalowania jego/jej manipulować pakietów, należy pamiętać o jego format w kroku re-pack:

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

Zainspirowany odpowiedzi z abarnert, zrobiłem bash skrypt, który rozpakuje pakiet o nazwie MyPackage.pkg do podfolderu o nazwie MyPackage_pkg, a następnie otwórz folder w Finderze. Usuń ostatni wiersz, jeśli nie chcesz kroku Findera.

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

Zastosowanie:

pkg-upack.sh MyPackage.pkg 

Ostrzeżenie: To nie będzie działać we wszystkich przypadkach, a nie z niektórych plików, np PKG wewnątrz instalatora systemu OSX. Jeśli chcesz tylko zajrzeć do pliku pkg i zobaczyć, co jest w środku, możesz wypróbować SuspiciousPackage (darmowa aplikacja), a jeśli chcesz zrobić poważne rozpakowanie, w tym wyodrębnianie określonych plików, to spójrz na Pacifist (nagware).

+0

'tar xvf Payload' działał świetnie na Yosemite – cde

+1

tar: Nierozpoznany format archiwum – malhal

+1

Użyj pbzx -n macOSUpd10.12.1.pkg/Ładunek | cpio -i dla nowszych archiwów (zaczerpnięte stąd: https://stackoverflow.com/a/41598227/5688277) –

2

@shrx Udało mi się rozpakować plik BSD.pkg (część instalatora Yosemite) za pomocą komendy "pbzx".

Komenda "pbzx" można pobrać z poniższego linku:

2

Możecie zajrzeć do mojego rozwidleniu pbzx tutaj: https://github.com/NiklasRosenstein/pbzx

Pozwala na strumieniowe przesyłanie plików pbzx, które nie są wra pped w archiwum XAR. Doświadczyłem tego z najnowszymi obrazami dyskowymi narzędzi wiersza poleceń XCode (np. 10.12 XCode 8).

pbzx -n Payload | cpio -i