如何仅在需要时(尚未安装)在 vagrant shell 上安装 Node.js?

How to install Node.js only if needed (not already installed) on a vagrant shell?

我在这里使用 vagrant shell 配置。 我已经在我的虚拟机 Node.js 上安装了许多其他软件包。 当我不需要它们时,我想在我的供应脚本中避免 运行ning 部分。 例如 - 我已经通过我的脚本 Node.js & nginx 成功安装,所以当我想添加额外的包如 mysql 或 redis 时,我想将它添加到脚本中,我想 运行 测试它 运行 是否正确的脚本,但我不想再次重新安装 Node.js 或 nginx...
我需要一个简单的条件语句来检测软件包是否已安装,并仅在尚未安装时安装它。
是否有通用检查,或者它会因包裹而异吗? 谢谢 半开

这取决于您使用的 Linux 发行版。通常,包管理器带有某种机制来跳过已经安装的包。

对于 Ubuntu,这是内置的 - 运行ning apt-get install nodejs 已经安装了 Node.js 不会重新安装它;它将跳过目标(除非有可用的新版本)

对于 ArchLinux,您可以添加 运行 pacman -Sy node --needed 以跳过已安装的软件包。

独立于平台的机制将检查可执行文件(或该包的任何其他已知文件)是否存在。在 Bash 中,您可以:

which node > /dev/null && echo "Yup, this is installed"

> /dev/null 部分抑制 which 的输出 - 它打印找到的可执行文件所在的路径;我们不关心那个,我们只想知道它是否已安装)

如果您想避免为此类基本检查编写自定义 Bash 脚本,我建议您使用专用于您想要实现的目标的工具来配置您的盒子。这里通常的嫌疑人是:

所有这些都由 Vagrant 支持,因此集成它们应该不是问题。您可以找到有关将这些集成到现有 Vagrant 配方中的详细指南 here

PS。对于一个简单的例子,你可以查看我的 Ansible provisioning recipe for Banana Pi machine 运行ning ArchLinux(注意:它并没有真正遵循最佳实践,但它可能是一个很好的起点) .网上有很多例子,你也可以看看。

dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>

这应该是您要查找的内容。

这是怎么回事: 这是 <condition> && <value if true> || <value if false>

形式的条件赋值

表达式的第一部分使用 dpkg 检查包是否已安装,抑制了输出。如果条件 returns 为假,则评估第二部分。 "true" 的情况被省略。