我有一个以前只针对基于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
Debian世界中的等价物是这样的:
dpkg --force-not-root --admindir=$WSDIR/dpkg --root=$WSDIR/install --install "$DEB"
但是,我坚持相当于rpmdb --initdb
步骤。
请注意,我可以使用以下方法解压缩存档:
dpkg-deb -x "$DEB" $WSDIR/install
但我更愿意接近真正的软件包的安装方式。另外我认为这不会运行preinstall
和postinstall
脚本。
类似的问题建议使用deboostrap
创建一个chroot
环境,但这会创建一个完整的新安装。除了过度杀伤之外,它对于自动化测试来说太慢了。在实际测试环境中进一步测试之前,我打算使用它来快速测试安装包。
我到目前为止的实验:
(cd $WSDIR/dpkg && mkdir alternatives info parts triggers updates)
cp /var/lib/dpkg/status $WSDIR/dpkg/status
充其量导致:
dpkg: error: unable to access dpkg status area: No such file or directory
这并不表示有什么问题。
那么如何创建一个dpkg管理目录呢?
Cross发布为https://superuser.com/questions/1271145/how-do-you-create-a-dpkg-admin-directory
更新24/11/2017
我尝试使用[cowdancer] [1](在引擎盖下使用deboostrap)创建的环境中使用dpkg dir进行复制,或者从/ var / lib / dpkg复制真实的dir,但我仍然得到相同的错误消息错误(和/或--admindir选项)并不意味着我认为它意味着什么。
注意:
sudo dpkg --force-not-root --root=$WSDIR/install --admindir=/var/lib/dpkg --install "$DEB"
确实有效。所以它与admin目录有关。我还将这个问题重新命名为“你如何创建一个dpkg管理目录”是一个有趣的问题,但答案并不一定是我的问题的解决方案。
创建dpkg数据库的最小方法是这样的:
$ mkdir -p db/{updates,info}
$ touch db/{status,diversions,statoverride}
如果你想使用它作为非root用户,目前最好的方法是使用fakeroot
。
$ mkdir -p fsys
$ PATH=/sbin:/usr/sbin:$PATH fakeroot dpkg --log=/dev/null --admindir=db --instdir=fsys -i pkg.deb
但考虑到在--root
或--admindir
之后传递--instdir
将重置这些路径,这是我认为你在这里遇到的问题。
使用sudo
和--force-not-root
也没有多大意义? :)并且绝对不如仅仅使用fakeroot
。在不久的将来,有可能在某些本地树中运行完全没有特权的dpkg
。
要快速测试普通依赖项,可以使用'dpkg -i'然后'dpkg -P'和'apt-get autoremove'直接在系统上安装,以清除包并清除依赖项。
另一个更安全但更慢的解决方案可能是使用autopkgtest软件包:https://people.debian.org/~mpitt/autopkgtest/README.package-tests.html
我最终找到了an answer for this。感谢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
有些要点需要注意:
--force-not-root
是不够的。 fakeroot
是必需的。ldconfig
和start-stop-daemon
必须在路上。 (因此PATH = / sbin:/ usr / sbin:$ PATH)/var/log/dpkg.log
重新定位日志文件--root
必须在--instdir
和--admindir
之前。