如何在流浪外壳上需要(尚未安装)时安装Node.js?

时间:2015-03-13 06:43:36

标签: node.js shell vagrant vagrantfile

我在这里使用vagrant shell配置。 我已经在我的vm Node.js上安装了许多其他软件包。 我想避免在我不需要它时在配置脚本中运行部件。 例如 - 我已经通过我的脚本Node.js&成功安装了nginx,所以当我想添加其他软件包如mysql或redis时,我想将它添加到脚本中,我想运行脚本来测试它是否正常运行,但我不想重新安装Node.js或nginx再次...
我需要一个简单的条件语句来检测是否已安装软件包,并且只有在尚未安装软件包时才安装它 是否存在通用检查,或者包装与包装有什么不同? 谢谢 Ajar

2 个答案:

答案 0 :(得分:1)

这取决于您正在使用的Linux发行版。通常,包管理器附带某种机制来skipp已安装的包。

对于Ubuntu,这是内置的 - 运行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运行ArchLinux的Banana Pi机器(注意:它并不是真正遵循最佳实践,但它可能是一个很好的起点)。网上有很多例子,也可以查看。

答案 1 :(得分:1)

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

这应该是你正在寻找的。

这里发生了什么: 这是<condition> && <value if true> || <value if false>

形式的条件分配

表达式的第一部分使用dpkg检查包是否已安装,从而抑制输出。如果条件返回false,则评估第二部分。 “真实”案例被省略。