代码之家  ›  专栏  ›  技术社区  ›  Ajar

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

  •  0
  • Ajar  · 技术社区  · 11 年前

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

    2 回复  |  直到 11 年前
        1
  •  1
  •   Rakesh Guha    11 年前
    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,则计算第二部分。省略了“真”情况。

        2
  •  1
  •   Robert Rossmann    11 年前

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

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

    推荐文章