如果不存在,如何通过Makefile安装gem

时间:2015-05-27 22:39:41

标签: ruby makefile gem

我正在为我的项目创建Makefile

build:
    sudo gem install sass

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

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

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

3 个答案:

答案 0 :(得分:1)

从命令行可以看到是否安装了gem list <gemname>的gem。这将打印出与<gemname>匹配的已安装宝石列表:

$ 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 list \^sass\$

*** LOCAL GEMS ***

sass (3.4.13, 3.4.1, 3.2.19)

-i的{​​{1}}标记使其在脚本中生成更多可用的输出,打印listtrue,并具有合适的退出状态:

false

你可以将它与Make的条件组合,并shell function(假设GNU make)来检查你的$ gem list \^sass\$ -i true $ echo $? 0 $ gem list \^notsass\$ -i false $ echo $? 1 是否安装了gem:

makefile

(需要额外ifeq ($(shell gem list \^sass\$$ -i), false) gem install sass endif 以防止尝试将其扩展为变量。)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

完成任务的一种快捷方法是编写.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运行它。