我正在为我的项目创建Makefile
:
build:
sudo gem install sass
任何时候我构建它都要求我输入我的超级用户密码。如果我删除sudo
,则根本不会安装,而是抛出错误,因为我没有安装gem
的权限。
所以我想出了一个想法,我想检查gem
是否已经存在,并且仅在不存在时运行安装命令。
所以问题是如何在Makefile
内执行此检查。
答案 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}}标记使其在脚本中生成更多可用的输出,打印list
或true
,并具有合适的退出状态:
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,请查看RVM或rbenv,它们都会在您的主目录中安装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
运行它。