私は次のようなMakefileの何かに取り組んでいます:
tarball: mkdir -p tmp/tarball/etc/service mkdir -p tmp/tarball/usr/local mkdir -p tmp/tarball/opt /myproject cdsensordatad; make cd sensortunneld; make device_name cp -r sensorservices tmp/tarball/etc/service #ここで次のようなtarballを作成します。 #chroot tmp/tarball; tar -czvfmyproject.tar.gz。
アイデアは、./tmp/tarball
ディレクトリに移動して、システムで解凍すると/etc/service
、/usr/local
、および/opt/myproject
に解凍されるtarballを作成できるようにすることです。
古典的なアプローチはtar -czvf -C tmp/tarball .
を使用することのようですが、これは./
で始まるエントリのtarリストにつながります。
私はGo言語のパッケージに触発されました。これは、次のコマンドとともにインストールする必要があることを示しています。
tar -C /usr/local -xzf go1.0.3.linux-AMD64.tar.gz
これは私のユースケースにとって理想的ですが、次のことができるようにしたいと思います。
tar -C / -xzf myproject.tar.gx
これにより、元々~/some-working-directory/tmp/tarball/_____
にあったファイルが/_____
に抽出されます。つまり、インストール構造を偽造するだけで済みます。
もちろん、これは私が除外していないfpm
のようなもので達成したほうがよいかもしれませんが、私は重い解決策に熱心ではなく、頼ることなくこれを行うことができると思いましたRubyに。
fakechroot
に出くわしました。これは有望なようですが、当然のことながら、charはchrootに存在しません。そのウサギの穴を降り始めたとき、私は何か間違ったことをしていると思ったので、尋ねる必要があります。援助。
GNU tarマニュアルから:
tar
がアーカイブからアーカイブメンバーを抽出するとき、メンバー名から先頭のスラッシュ( `/ ')をすべて削除します。これにより、アーカイブ内の絶対メンバー名が相対ファイル名として扱われます。これにより、アーカイブで指定された正確なディレクトリ内のメンバーの抽出に制限されるのではなく、そのようなメンバーを必要な場所で抽出できます。たとえば、アーカイブメンバーの名前が `/etc/passwd
'の場合、tarはその名前が実際には`etc/passwd
'であるかのように抽出します。
したがって、私のタールの作成は次のようになります。
tar -czvf myproject.tar.gz -C tmp/tarball ./
./
./etc/
./etc/service/
./etc/service/sensorservices/
./usr/
./usr/local/
./opt/
./opt/myproject/
これがインストールされている場合:
Sudo tar --directory / -xzf ./myproject.tar.gz
Sudo tar -C / -xzf ./myproject.tar.gz
その後、良くも悪くも、すべてが期待どおりに機能します。
なぜそんなに複雑なのですか?
cd tmp/tarball; tar -czvf ../../myproject.tar.gz .