如何仅在需要时(尚未安装)在 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" 的情况被省略。
我在这里使用 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" 的情况被省略。