我正在尝试安装一个.deb
包,但是它需要几个依赖项,例如 nodejs、nodejs-underscore,但所有这些依赖项都已通过安装nvm
并可用。
有没有什么办法可以让我apt-get
识别通过 nvm 安装的软件包,这样它们就不会发生冲突?我知道 apt-get 是系统范围的,而 nvm 在本地用户空间工作,所以这可能需要一些黑客攻击。
答案1
最简单的方法,只要可能,就是仅有的使用nvm
或者 .deb
软件包。从长远来看,这可能会为您省去很多麻烦,因此请先研究一下。似乎软件包提供的几乎所有与节点相关的内容.deb
都可以通过以下方式安装nvm
。
但是,如果这确实不可能,您可以使用并创建“虚拟”.deb
包来表明您已安装依赖项。请注意,如果您出错,这可能会使 apt 感到困惑。此外,即使您卸载了包,apt 仍会认为您拥有在虚拟包中定义的替代品,直到您卸载虚拟包本身。equivs-control
equivs-build
apt
nvm
首先,安装“equivs”以便我们可以构建虚拟包:
sudo apt-get install equivs
创建描述虚拟包的控制文件:
cd ~
equivs-control nodejs-dummy
编辑此控制文件:
nano nodejs-dummy
取消注释并根据需要更改控制文件中的行。特别是设置“Provides:”行以列出您使用 替换的包nvm
。例如:
Package: nodejs-dummy
Version: (version slightly higher than what the apt package actually provides)
Maintainer: Your Name <[email protected]>
Provides: nodejs
Architecture: all
Description: Something that will remind you what this does ;)
构建包:
equivs-build nodejs-dummy
最后,安装它:
sudo dpkg -i nodejs-dummy_use_the_actual_filename.deb
对您使用 替换的所有软件包重复上述操作nvm
。如果某个软件包依赖于您用 替换的另一个软件包的特定版本nvm
,则可能需要使用它所依赖的确切版本号。不过,我不确定这样做会产生什么问题,并且每当操作系统软件包更改版本时,您很可能都需要继续重建虚拟软件包。
答案2
这是 nvm 分发软件的方式存在的问题。他们根本没有进行任何特定于发行版的打包。具体来说,我快速阅读了 nvm,他们只是在 wget 二进制文件。例如,这是它为 nodejs 6 安装的内容:https://nodejs.org/.../lates.../node-v6.3.1-linux-x64.tar.gz这不包含任何标准的 .deb 或 .rpm 元数据,因此在它们正确发布真正的软件包之前,任何发行版级别的软件包管理器都无能为力,而且它们可能会相互冲突。如果我理解正确的话,nvm 发布适当的软件包并不是他们感兴趣的事情,因为这将他们与支持特定于发行版的软件包联系在一起。因此,我们改用 nvm 的 hack。也许可以针对他们的 git 提出问题。这只能由 nodejs 社区来纠正。
值得注意的是,npm 和 nvm 目前似乎不支持任何代码签名概念(来源) 因此与大多数发行版的软件包管理器都支持良好支持的发行版打包相比。这是一种相当不安全的安装系统软件包的方法。
答案3
不,正如您所说的,您不能。Apt 在系统级别工作,而常规 nvm 在用户级别安装软件包。
你有两个选择 -
通过 nvm 安装所需的软件包并使用已安装的其他 nvm 软件包,或者
使用该包安装
apt-get
并安装所有依赖项。