【问题标题】:How to install gem via Makefile if it doesn't exist如果它不存在,如何通过 Makefile 安装 gem
【发布时间】:2015-06-01 07:21:39
【问题描述】:

我正在为我的项目创建一个Makefile

build:
    sudo gem install sass

任何时候我构建它都会询问我的超级用户密码。如果我删除sudo,它根本不会安装,而是会抛出错误,因为我没有权限安装gem

所以我想出了一个想法,我想检查gem是否已经存在,并且只有在它不存在时才运行安装命令。

所以问题是如何在Makefile 中执行此检查。

【问题讨论】:

  • 您将如何在makefile 外部执行该检查?
  • @EtanReisner 如果我知道怎么做,Makefile 不会有问题。示例检查在这里,但对我没有多大帮助:stackoverflow.com/questions/1032114/… 我可能会编写一个.rb 脚本来执行检查并输出/返回一些东西,但我将它作为最后的手段。
  • 我的意思是这里的“在makefile中”位对这个问题并不重要。如果您可以在生成文件之外进行检查,则可以在其中进行检查。因此,如果您的问题是如何检查,那么您应该提出这个问题(并省略 makefile 位),并且您链接到的那个问题似乎已经有了您的答案。所以,如果这不是问题,那么问题是什么?你不能神奇地在 makefile 中做任何你不能正常做的事情。因此,如果您通常需要一个 ruby​​ 脚本,那么您也需要一个 makefile 中的脚本。
  • @EtanReisner 是的,你是对的 - 我在 Makefile 本身内无能为力,所以我创建了一个简单的 ruby 脚本来解决这个问题。

标签: ruby makefile gem


【解决方案1】:

在命令行中,您可以查看是否使用 gem list <gemname> 安装了 gem。这会打印出与 <gemname> 匹配的已安装 gem 列表:

$ gem list sass

*** LOCAL GEMS ***

sass (3.4.13, 3.4.1, 3.2.19)
sass-rails (5.0.1, 4.0.3)

参数实际上是一个正则表达式,所以你可以更具体,例如检查只有 Sass gem 本身:

$ gem list \^sass\$

*** LOCAL GEMS ***

sass (3.4.13, 3.4.1, 3.2.19)

-i 标志到list 使其在脚本中产生更有用的输出,打印truefalse,并具有合适的退出状态:

$ gem list \^sass\$ -i
true
$ echo $?
0
$ gem list \^notsass\$ -i
false
$ echo $?
1

您可以将它与 Make 的条件句和 shell function(假设是 GNU make)结合起来检查是否从您的 makefile 安装了 gem:

ifeq ($(shell gem list \^sass\$$ -i), false)
    gem install sass
endif

(需要额外的 $ 以防止 make 尝试将其扩展为变量。)

【讨论】:

    【解决方案2】:

    现在在 Ruby 社区中,使用Bundler 来管理/安装依赖项已成为传统。这将在您没有 sudo privs 的情况下安装 Gems,并且还会将不同的 Ruby 项目的 gem 分开。

    如果您必须安装 gem raw,请查看 RVMrbenv,它们都会在您的主目录中安装 Ruby 和任何未来的 gem。您必须将一些逻辑添加到您的 Makefile 中,以使其在您的主文件夹中使用新的 Ruby(rbenv 可能比 rvm 更容易,尽管我不确定)......但这并不难。

    【讨论】:

    • 是的,我需要一个原始的sass gem。这不是我正在开发的ruby 应用程序。我想出了一个主意并添加了我的答案。
    【解决方案3】:

    完成任务的一个快速方法是编写一个.rb 脚本并从Makefile 执行它。我想出的最简单的脚本如下:

    #!/usr/bin/env ruby
    if !Gem::Specification::find_all_by_name('sass').any?
      exec("sudo gem install sass")
    end
    

    find_all_by_name 总是返回一个数组,并且在找不到任何东西时不会引发错误(就像find_by_name 所做的那样)。

    生成文件:

    default:
        ./install.rb
    

    确保install.rb 是可执行的:

    chmod +x install.rb
    

    使用make 运行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      相关资源
      最近更新 更多