我有一个以前只针对基于 RPM 的发行版的软件包,我现在正在为基于 Debian 的发行版构建 .deb 软件包。
目的是从与您正在构建的系统隔离的用户空间模拟测试安装。它可能是多用户的,您不希望仅仅为了构建软件而需要 root 访问权限。我们的许多测试已经模拟了安装目录结构。这是使用构建的包模拟实际安装的下一步。
对于 RPM 包,我能够使用以下方法创建测试安装:
WSDIR=/where/I/want/my/tests/to/run
rpmdb --initdb --dbpath "$WSDIR"/rpmdb
rpm --relocate /opt="$WSDIR"/opt --dbpath $WSDIR/rpmdb -i <package>.rpm
Run Code Online (Sandbox Code Playgroud)
Debian 世界中的等价物是这样的:
dpkg --force-not-root --admindir=$WSDIR/dpkg --root=$WSDIR/install --install "$DEB"
Run Code Online (Sandbox Code Playgroud)
但是,我被困在相当于该rpmdb --initdb步骤的地方。
请注意,我可以使用以下方法解压缩存档:
dpkg-deb -x "$DEB" $WSDIR/install
Run Code Online (Sandbox Code Playgroud)
但我更愿意更接近于真正的包是如何安装的。另外我认为这不会运行preinstall和postinstall脚本。
类似的问题建议使用deboostrap来创建chroot环境,但这会创建一个完整的新安装。除了矫枉过正之外,它对于自动化测试来说太慢了。我打算在实际测试环境中进一步测试之前使用它来快速测试安装包。
到目前为止我的实验:
(cd $WSDIR/dpkg && mkdir alternatives info parts triggers updates)
cp /var/lib/dpkg/status $WSDIR/dpkg/status
Run Code Online (Sandbox Code Playgroud)
最好的结果是:
dpkg: error: unable to access dpkg status area: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这并没有表明清楚什么是错误的。
那么,如何做,你创建的dpkg admin目录?
交叉发布为https://superuser.com/questions/1271145/how-do-you-create-a-dpkg-admin-directory
更新 24/11/2017
我已经尝试使用 dpkg 目录从 [cowdancer][1](在引擎盖下使用 deboostrap)创建的环境中复制或从 /var/lib/dpkg 复制真实的,但我仍然收到相同的错误消息,所以也许错误(和/或 --admindir 选项)并不像我认为的那样。
注意:
sudo dpkg --force-not-root --root=$WSDIR/install --admindir=/var/lib/dpkg --install "$DEB"
Run Code Online (Sandbox Code Playgroud)
确实有效。所以这与管理目录有关。我还将问题重新命名为“您如何创建 dpkg 管理目录”是一个有趣的问题,但答案不一定是我的问题的解决方案。
我最终找到了这个问题的答案。感谢 Guillem Jover 所做的一些工作。将其副本粘贴到此处:
mkdir fake
mkdir fake/install
mkdir -p fake/dpkg/info
mkdir -p fake/dpkg/updates
touch fake/dpkg/status
PATH=/sbin:/usr/sbin:$PATH fakeroot dpkg --force-script-chrootless --log=`pwd`/fake/dpkg.log --root=`pwd`/fake --instdir `pwd`/fake --admindir=`pwd`/fake/dpkg --install *.deb
Run Code Online (Sandbox Code Playgroud)
需要注意的几点:
--force-not-root是不足够的。fakeroot是必须的。
ldconfig并且start-stop-daemon必须在路上。(因此 PATH=/sbin:/usr/sbin:$PATH)
日志文件需要从默认位置重新定位/var/log/dpkg.log
参数的顺序很重要。如果使用--root必须在--instdir和之前--admindir。
admindir 应该以安装目录作为前缀。
如果包包含任何安装前或安装后脚本(preinst、postinst),则需要 --force-script-chrootless,因为这些脚本通常通过 chroot() 运行,这在 fakeroot 下尝试时不允许进行操作。
值得一提的是,现代解决方案是在 Docker 沙箱环境中进行正常安装。