pkgファイルを解凍およびパックする方法


99

Mac用のインストールメーカーによって作成されたpkgファイルがあります。pkgの1つのファイルを置き換えたい。ただし、これはダウンロードプロセスの一部であるため、Linuxシステムではこれを行う必要があります。ユーザーがファイルサーバーのダウンロードを開始すると、pkg内の1つのファイルを置き換える必要があります。私はpkgを解凍してファイルを置き換える方法を持っていますが、pkgに再度パックする方法がわかりません。 http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html


(将来の訪問者向け)gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10で洞察が得られるかもしれない
james_womack

MacOSにはxarコマンドが付属しているようです。
MikeP

回答:


186

パッケージは、拡張子が異なり、ファイル階層が指定された.xarアーカイブです。残念ながら、そのファイル階層の一部は、実際のインストール可能ファイルのcpio.gzアーカイブであり、通常は編集するものです。また、そのcpioアーカイブ内のファイルに関する情報を含むBomファイルと、概要情報を含むPackageInfoファイルもあります。

情報ファイルの1つを編集する必要があるだけなら、それは簡単です。

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

ほとんどのLinuxディストリビューションでmkbom(およびlsbom)を入手できると思います。(あなたが同上を得ることができれば、それは物事をさらに簡単にしますが、それがユビキタスでほぼ利用可能であるかどうかはわかりません。)


はい。私は以前にこの方法を試しましたが(ファイルを変更せずに解凍/パックのみ)、このpkgをインストールした後は何も起こりませんでした。コンソールで次のメッセージが表示されました:posix_spawn( "/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1"、...):そのようなファイルやディレクトリはありません。古いペイロードファイルに/./ Project1.app / ...があり、新しいペイロードに/Project1.app / ...があることを調査しました。
dream2work

まあ、最後の部分は簡単です。それが違いを生むかどうかはわかりませんが、そうかもしれません(おそらく、Bomとペイロードが一致しないためでしょうか?)。find | cpio | gzipコマンドでFoo.appの代わりに./Foo.appを使用するだけです。答えを編集します。
abarnert

4
@abarnert:代わりにcat Payload | gunzip -dc |cpio -i単純に使用できますtar xzvf Payload
ccpizza '21

実行中にエラーが発生しますcat Payload | gunzip -dc |cpio -igunzip: unknown compression format; 0 blocksBSD.pkgOS X Yosemiteインストールパッケージから開こうとしています。
shrx 2014年

1
私はxarを持っていなかったので、試してみ7z x <file>.pkgました。

21

以下はabarnertの回答に触発されたbashスクリプトで、という名前MyPackage.pkgのサブフォルダーにという名前のパッケージを解凍し、MyPackage_pkgそのフォルダーをFinderで開きます。

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

使用法:

    pkg-upack.sh MyPackage.pkg

警告:これはすべてのケースで機能するわけではなく、OSXシステムインストーラー内のPKGなどの特定のファイルで失敗します。pkgファイルを調べて内容を確認したい場合は、SuspiciousPackage(無料アプリ)を試すことができます。特定のファイルを選択的に解凍するなどのオプションがさらに必要な場合は、Pacifist(nagware)をご覧ください。


2
pbzx -n macOSUpd10.12.1.pkg / Payloadを使用します。新しいアーカイブの場合はcpio -i(ここから取得:stackoverflow.com/a/41598227/5688277
Adrian O'Connor

3

@abarnertが言ったことに加えて、私は今日cpio、Mountain Lionのデフォルトのユーティリティがデフォルトごとに異なるアーカイブ形式を使用していることを確認する必要がありました(どちらかわからない)。そのため、cpio read error: bad file format操作されたパッケージをインストールしようとしているときに誰かがメッセージに遭遇した場合は、必ず再パック手順にフォーマットを含めてください。

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

3

@shrx「pbzx」コマンドを使用して、BSD.pkg(Yosemiteインストーラーの一部)を解凍することに成功しました。

pbzx <pkg> | cpio -idmu

「pbzx」コマンドは、次のリンクからダウンロードできます。


2

pbzxここの私のフォークを調べたいかもしれません:https : //github.com/NiklasRosenstein/pbzx

XARアーカイブにラップされていないpbzxファイルをストリーミングできます。最近のXCodeコマンドラインツールのディスクイメージ(例:10.12 XCode 8)でこれを経験しました。

pbzx -n Payload | cpio -i
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.