在我的系统上我通过直接编译源代码或通过其他不使用包管理器的方式安装了几个程序(例如,我直接从网站提供的 iso 安装了 TeX Live),其中一个例子是 ViM:我通过直接编译源代码安装了它并运行sudo make install
。
问题是包管理器不知道我的系统上安装了此类软件,因此它要求我安装它(例如,如果我键入apt install vim
它会告诉我可以安装 ViM,即使我已经安装了 ViM)我的系统)。
如何让包管理器知道某些包中包含的程序已经安装了?
提前致谢。
编辑:这个问题来自我安装 GNU-Octave 的需要。我已经安装了 texlive(正如我之前提到的),但仍然apt
想安装tex-common
和texinfo
.我在安装之前通过键入检查了 texinfo 包的内容是否存在man texinfo
,并显示了手册页。安装后,texinfo
该apt install texinfo
手册页发生了变化。
答案1
包管理器需要一些有关包的数据才能发挥其作用。路径、配置文件、启动和停止服务、安装前和删除后脚本、依赖项等内容......
如果您从源代码进行编译,并且源代码没有系统使用的软件包的构建目标,则很难让系统知道手动安装的软件(请注意,在软件包管理器的眼中,没有任何东西是已安装)。它相当于从源创建一个合适的包(例如,.deb)。
因此,答案是检查源是否具有系统中使用的包的构建目标。如果没有,那么您必须自己创建结构来构建包。
Octave 工作人员属于另一个问题。如果这是您真正的问题,请开始一个新问题,并发布apt
命令和输出。
答案2
您可以通过安装存根“等效”包来欺骗包管理器。这当量包可以帮助你创建这些,它的描述是:
规避 Debian 软件包依赖性
该软件包提供了一个创建简单 Debian 软件包的工具。通常,这些包仅包含依赖项信息,但它们也可以像其他包一样包含正常安装的文件。
其用途之一是创建元包:该包的唯一目的是声明对其他包的依赖关系和冲突,以便自动安装、升级或删除这些包。
另一个用途是规避依赖项检查:通过让 dpkg 认为特定的软件包名称和版本已安装(而实际上并未安装),您可以解决其他软件包依赖项中的错误。 (不过,请仍然提交此类错误。)
请注意,从此时起您将只能靠自己了。希望您有充分的理由选择此路线,而不是从软件包安装软件(最好是向后移植,甚至是由checkinstall
)。
答案3
我遇到了类似的问题,因为我花了一段时间才弄清楚,所以我想我应该把我的解决方案放在这里。
这是一个可以使用包名称列表调用的脚本,它构建可安装的 .deb 包文件。
完成后(需要几秒钟或更短的时间),您可以使用“dpkg -i *.deb”安装软件包
#!/bin/bash
# default version ('high' to supercede further updates)
VERSION=99.99-99.99
# debian-version, urgency, date
RELEASE="experimental; urgency=low\n\n * Initial Release\n\n -- Dummy <[email protected]> Thu, 31 Dec 2099 00:00:00 +0000\n"
# iterate over command-line arguments
for PKGNAME do
# check for existing package, to borrow the control file
echo -n "\n${PKGNAME} : exists in dpkg ? "
grep -m 1 "^Package: ${PKGNAME}$" /var/lib/dpkg/status \
&& {
echo " .. YES .. try use dpkg version of control file"
grep -A 2000 "^Package: ${PKGNAME}$" /var/lib/dpkg/status | \
sed "s|^\(Package:\)|~\1|" | tr '\n~' '^\n' | \
head -n 2 | tr '^' '\n' | grep "[^ ]" \
> ${PKGNAME}.ctl
# remove borrowed control-file if none found
find . -maxdepth 1 -type f -name ${PKGNAME}.ctl -size 0 -delete || \
echo " .. (but failed)"
}
# if we didn't successfully borrow a control-file, fake it to make it
[ -f ${PKGNAME}.ctl ] || \
{
echo " .. NO .. use template (/usr/share/equivs/template*)"
equivs-control ${PKGNAME}.ctl
sed -i "s/^Package:.*/Package: ${PKGNAME}/" ${PKGNAME}.ctl
sed -i "s/.*Changelog:.*/Changelog: dummychangelog/" ${PKGNAME}.ctl
echo -e "${PKGNAME} (${VERSION}) ${RELEASE}" > dummychangelog
}
# now, with a control-file, build a deb file
[ -f ${PKGNAME}.ctl ] && \
{
sed -i "s/^Version:.*/Version: ${VERSION}/" ${PKGNAME}.ctl
equivs-build ${PKGNAME}.ctl 2>&1 > ${PKGNAME}.ctl.log
# cleanup if we succeeded
ls -l ${PKGNAME}*.deb && { rm dummychangelog ${PKGNAME}.ctl.log ${PKGNAME}.ctl 2>/dev/null ; }
}
done