2012-07-02 30 views
71

Tôi có tệp pkg được tạo bởi Install Maker cho Mac. Tôi muốn thay thế một tệp bằng pkg. Nhưng tôi phải làm điều này dưới hệ thống Linux, bởi vì đây là một phần của quá trình tải xuống. Khi người dùng bắt đầu tải xuống máy chủ tệp phải thay thế một tệp bằng pkg. tôi có một giải pháp như thế nào giải nén pkg và thay thế một tập tin nhưng tôi không biết làm thế nào đóng gói một lần nữa để pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.htmlLàm cách nào để giải nén và đóng gói tệp pkg?

+0

(Đối với khách tham quan trong tương lai) http://gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10/ có thể cung cấp cho bạn cái nhìn sâu sắc –

+0

MacOS dường như đi kèm với lệnh XAR . – MikeP

Trả lời

137

Gói chỉ là lưu trữ .xar có phần mở rộng khác và phân cấp tệp được chỉ định. Thật không may, một phần của hệ thống phân cấp tệp đó là bản lưu trữ cpio.gz của các cài đặt thực tế và thường là những gì bạn muốn chỉnh sửa. Và cũng có một tệp Bom bao gồm thông tin về các tệp bên trong kho lưu trữ cpio đó và tệp PackageInfo bao gồm thông tin tóm tắt.

Nếu bạn thực sự chỉ cần chỉnh sửa một trong các tập tin thông tin, đó là đơn giản:

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

Nhưng nếu bạn cần phải chỉnh sửa các tập tin cài đặt:

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 

Tôi tin rằng bạn có thể nhận được mkbom (và lsbom) cho hầu hết các bản phân phối Linux. (Nếu bạn có thể nhận được ditto, điều đó làm cho mọi thứ trở nên dễ dàng hơn, nhưng tôi không chắc liệu nó gần như có sẵn ở mọi nơi không.)

+0

Có. Tôi đã thử phương pháp này trước đây (chỉ giải nén/gói mà không thay đổi bất kỳ tập tin), nhưng sau khi cài đặt này pkg không có gì happend. Trong giao diện điều khiển, tôi nhận được thông báo này: posix_spawn ("/ Library/Application Support/Project1/Project1.app/Contents/MacOS/Project1", ...): Không có tệp hoặc thư mục nào như vậy. Tôi đã điều tra rằng tệp Tải trọng cũ có /./ Project1.app/... và tải trọng mới có /Project1.app/... bên trong. – dream2work

+0

Vâng, phần cuối cùng là dễ dàng. Tôi không biết liệu nó có tạo nên sự khác biệt hay không, nhưng có lẽ (có lẽ vì Bom và Payload không khớp?). Chỉ cần sử dụng ./Foo.app thay vì Foo.app trong lệnh find | cpio | gzip. Tôi sẽ chỉnh sửa câu trả lời. – abarnert

+3

@abarnert: thay vì 'mèo Payload | gunzip -dc | cpio -i' bạn có thể đơn giản sử dụng 'tar xzvf Payload' – ccpizza

3

Ngoài những gì @abarnert đã nói, hôm nay tôi phải tìm hiểu rằng tiện ích cpio mặc định trên Mountain Lion sử dụng một định dạng lưu trữ khác nhau cho mỗi mặc định (không chắc chắn), ngay cả với trang người đàn ông nói nó sẽ sử dụng định dạng cpio/odc cũ. Vì vậy, nếu có ai tình cờ gặp được thông báo cpio read error: bad file format trong khi cố gắng cài đặt/gói thao túng của mình, hãy chắc chắn để bao gồm các định dạng trong bước tái gói:

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

Lấy cảm hứng từ câu trả lời từ abarnert, tôi đã bash kịch bản mà sẽ giải nén một gói có tên MyPackage.pkg vào một thư mục con tên là MyPackage_pkg và sau đó mở thư mục trong Finder. Hủy bỏ dòng cuối cùng nếu bạn không muốn bước Finder.

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

Cách sử dụng:

pkg-upack.sh MyPackage.pkg 

Cảnh báo: Điều này sẽ không làm việc trong mọi trường hợp, và sẽ thất bại với các tập tin nhất định, ví dụ PKG bên trong trình cài đặt hệ thống OSX. Nếu bạn chỉ muốn nhìn vào bên trong file pkg và xem những gì bên trong, bạn có thể thử SuspiciousPackage (ứng dụng miễn phí), và nếu bạn muốn làm một số giải nén nghiêm trọng, bao gồm cả giải nén tập tin cụ thể, sau đó có một cái nhìn tại Pacifist (nagware).

+0

'tar xvf Payload' hoạt động tốt trên Yosemite – cde

+1

tar: Định dạng lưu trữ không được công nhận – malhal

+1

Sử dụng pbzx -n macOSUpd10.12.1.pkg/Payload | cpio -i cho các bản lưu trữ mới hơn (được lấy từ đây: https://stackoverflow.com/a/41598227/5688277) –

2

@shrx Tôi đã thành công để giải nén BSD.pkg (một phần của trình cài đặt Yosemite) bằng cách sử dụng lệnh "pbzx".

Các "pbzx" lệnh có thể được tải về từ liên kết sau:

2

Bạn có thể muốn nhìn vào ngã ba của tôi về pbzx đây: https://github.com/NiklasRosenstein/pbzx

Nó cho phép bạn truyền tệp pbzx không bao bọc trang trong một kho lưu trữ XAR. Tôi đã trải nghiệm điều này với các Hình ảnh Đĩa Công cụ Dòng lệnh XCode gần đây (ví dụ: 10.12 XCode 8).

pbzx -n Payload | cpio -i 
Các vấn đề liên quan