我曾经yaourt
成功地构建和安装 AUR 包,遗憾的是忽略了这样一个事实:在默认配置中,构建的包在安装后会被删除。由于构建大约需要 24 小时,并且让该包供以后使用可能会很有用,因此有没有什么方法可以从已安装的二进制文件重建该包,而不必makepkg
再次构建?或者更一般地说,因为这不一定是yaourt
- 绑定的:
如何
makepkg
从安装和源中检索生成的包而无需重新编译?
答案1
有一个脚本是pacman
包的一部分,名为bacman
,它使用 pacman 数据库和系统上的文件重新创建包。
但请注意,这种方法只能用作最后的手段,因为,由于安装后对文件的修改,软件包很可能会有所不同。
答案2
我对此表示怀疑,但这里有一些对你有用的提示,
依赖项和文件存储在 中/var/lib/pacman/local/XX-Version/{desc, files}
,因此压缩它们并不难。
xz 包中的层次结构应该是这样的:
.PKGINFO 和 .INSTALL(安装后脚本)可以从 PKGBUILD(可通过 abs 或 yaourt 检索)转换。
答案3
感谢中的提示沃克的回答我写了这个脚本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
而不是下载整个源代码。但现在它工作得很好。