如何仅在需要(尚未安装)的情况下在vagrant shell上安装Node.js?

如何仅在需要(尚未安装)的情况下在vagrant shell上安装Node.js?,node.js,shell,vagrant,vagrantfile,Node.js,Shell,Vagrant,Vagrantfile,我在这里使用的是vagrant shell配置。 我已经在vm Node.js上安装了许多其他软件包。 我希望在不需要部件时避免在配置脚本中运行部件。 例如,我已经通过我的script Node.js和nginx成功安装,因此当我想添加其他包(如mysql或redis)时,我想将其添加到脚本中,我想运行脚本以测试它是否正常运行,但我不想再次重新安装Node.js或nginx… 我需要一个简单的条件语句,该语句将检测包是否已安装,并仅在尚未安装时安装它。 是否有一般检查,或者每个包的检查是否不同?

我在这里使用的是vagrant shell配置。 我已经在vm Node.js上安装了许多其他软件包。 我希望在不需要部件时避免在配置脚本中运行部件。 例如,我已经通过我的script Node.js和nginx成功安装,因此当我想添加其他包(如mysql或redis)时,我想将其添加到脚本中,我想运行脚本以测试它是否正常运行,但我不想再次重新安装Node.js或nginx…
我需要一个简单的条件语句,该语句将检测包是否已安装,并仅在尚未安装时安装它。
是否有一般检查,或者每个包的检查是否不同? 谢谢
这取决于您使用的Linux发行版。通常,包管理器带有某种机制来跳过已安装的包

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

对于ArchLinux,您可以添加run
pacman-Sy节点--needed
来跳过已经安装的包

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

哪个节点>/dev/null&&echo“是的,这已经安装”

/dev/null
部分禁止
的输出-它打印找到的可执行文件所在的路径;我们不关心这一点,我们只想知道它是否已安装)

如果您不想为这些基本检查编写自定义Bash脚本,我建议您使用专门用于实现目标的工具来配置您的方框。这里常见的嫌疑犯是:

所有这些都是由Vagrant支持的,所以整合它们应该不是问题。你可以找到详细的指南,将这些整合到你现有的流浪食谱中

另外,对于一个简单的例子,您可以查看我的运行ArchLinux的香蕉Pi机器(注意:它并没有真正遵循最佳实践,但它可能是一个很好的起点)。在线提供了许多示例,也可以查看它们。

dpkg-s2>/dev/null>/dev/null | | sudo apt get-y install
dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>
这应该是你要找的

这里发生了什么: 这是形式为
&&&|


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

你好,罗伯特&谢谢你的回复!我使用ubuntu,对于安装了apt get的软件包,很高兴知道它会自动检查现有的软件包。然而,有些软件包是从源代码安装的(比如NodeJS和我的例子中的其他软件包),所以我不能只依赖于此。你的“哪”行对我来说太棒了,我只需要剩下的。。。如果一个软件包没有-安装它。我是bash脚本的初学者。在检查了不同的编排工具之后,Ansible将是我的选择,但我将在扩展时进行讨论。现在我只想创建简单的部署工作流,无法承受另一个学习曲线。对我来说,这是一个矫枉过正的现在,虽然这些工具看起来惊人。Docker-machine/compose/swarm、CoreOS etcd/systemd/fleet、Mesos Zookeeper等公司也是如此。。。它永远不会结束。。。我现在真正需要的只是一个简单的bash“if”语句,检查我的ubuntu服务器上是否已经安装了一个包,如果没有安装,请帮我安装好吗?干杯,再次感谢罗伯特!也许会有帮助?嘿,罗伯特,看-我错过了bash的基本知识-定义变量,if语句等等。。。这就是为什么我张贴我的问题。对于任何有bash脚本经验的人来说,这应该需要两秒钟。我愚蠢的尝试:哪个节点>我的节点?如果[My_node\u VER-ne null]然后回显“我应该安装节点”fi