如何从已安装的包重新创建包文件?

Tob*_*ler 5 arch-linux pacman yaourt

我曾经yaourt成功地构建和安装了一个 AUR 包,不幸的是,在默认配置中,构建的包在安装后被删除了这一事实。由于构建需要大约 24 小时,并且让软件包可供以后使用可能会有用,有没有办法从已安装的二进制文件中重建软件包,而不必makepkg再次使用它?或者更一般地说,因为这不一定是yaourt绑定的:

如何在makepkg无需重新编译的情况下从安装和源中检索生成的包?

rem*_*mmy 5

有一个脚本是pacman包的一部分,bacman它使用 pacman 数据库和系统上的文件重新创建包。

但是请注意,这种方法只能作为最后的手段使用,因为首先,由于安装后对文件的修改,包很可能会有所不同。


Tob*_*ler 2

感谢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
Run Code Online (Sandbox Code Playgroud)

运行fakepkg packagenamePKGBUILD必要时进行调整,并希望package---.pak.tar.xz在您的当前目录中出现。

当然还有很大的改进空间,例如PKGBUILD根据安装自动修改desc而不是下载整个源代码。但现在它工作得很好。