web-dev-qa-db-ja.com

インストールされたパッケージからパッケージファイルを再作成するにはどうすればよいですか?

yaourtを使用してAURパッケージを正常にビルドおよびインストールしましたが、残念ながら、デフォルトの構成では、ビルドされたパッケージがインストール後に削除されるという事実を見逃していました。ビルドには約24時間かかり、後でパッケージを利用できるようにしておくと便利な場合があるので、再度makepkgする代わりに、インストールされたバイナリからパッケージを再構築する方法はありますか?または、より一般的には、これは必ずしもyaourt-tiedではないため:

再コンパイルせずに、インストールおよびソースからmakepkgで生成されたパッケージを取得するにはどうすればよいですか?

5
Tobias Kienzler

warl0ckの答え のヒントのおかげで私はこのスクリプトを書きましたfakepkg

#!/bin/bash
set -e

OLDDIR=$PWD

NEWDIR=$(mktemp -dt fakepack.XXX)
cd $NEWDIR

yaourt -G $1
cd $1

#TODO this can probably be retrieved from the pacman desc file
while true; do
  read -p "Edit PKGBUILD? [yn]" -n1 yn
  case $yn in
    [Yy]* ) $EDITOR PKGBUILD; break;;
    [Nn]* ) echo; break;;
    * ) echo ;;
  esac
done

. PKGBUILD
srcdir=$NEWDIR/$1/src
# In case you are wondering: this tries to compensate for packages not using
# a simple src/packagename-pkgver/ structure. It will probably still break...
PKSUB=$(eval "echo $(grep -o '\${\?srcdir.*pkgver}\?' PKGBUILD | head -n1 )")
SRC=${PKSUB##$NEWDIR/$1/}
echo "Putting the $1 source to $SRC"

PKG=$pkgname-$pkgver
# SRC="src/$PKG/"
FILES="/var/lib/pacman/local/$PKG-$pkgrel/files"

if [ ! -f $FILES ]; then
  echo "$FILES not found, is $1 actually installed?"
  exit 1
fi

#TODO use existing sources or skip this entirely
#     but it's the easiest way to later use makepkg -R
echo "Reloading source"
makepkg -o

echo "Collecting $1 files"
mkdir -p $SRC/files/
while IFS= read -r line; do
  if [ -f "/$line" ]; then
    mkdir -p $SRC/files/$(dirname $line)
    rsync -a /$line $SRC/files/$line
  fi
done < $FILES

echo "Creating fake Makefile"
echo 'install:' > $SRC/Makefile
echo '  mv files/* $(DESTDIR)' >> $SRC/Makefile
rm -f $SRC/GNUmakefile

echo "Creating package"
makepkg -R
mv *.xz $OLDDIR
cd $OLDDIR
rm -rf $NEWDIR

実行fakepkg packagename、必要に応じてPKGBUILDを適応させ、package---.pak.tar.xz現在のディレクトリ。

もちろん、改善の余地はたくさんあります。インストールのPKGBUILDに従ってdescを自動的に変更し、ソース全体をダウンロードしません。しかし今のところ、それは十分に機能します。

2
Tobias Kienzler

pacmanと呼ばれるbacmanパッケージの一部であるスクリプトがあり、pacmanデータベースとシステム上のファイルを使用してパッケージを再作成します。

ただし、このようなアプローチは最後の手段としてのみ使用する必要があることに注意してください。たとえば、インストール後のファイルの変更により、パッケージが異なる可能性があります。

5
kyrias

私はそれを疑っていますが、ここにあなたのために働くいくつかのヒントがあります、

依存関係とファイルは/var/lib/pacman/local/XX-Version/{desc, files}に保存されるため、圧縮するのは難しくありません。

Xzパッケージの階層は次のようになります。

enter image description here

.PKGINFOおよび.INSTALL(インストール後のスクリプト)は、PKGBUILD(absまたはyaourtを介して取得可能)から変換できます。

2
daisy