我需要从 bash 脚本中检查是否安装了某些 Ruby gem。
我以为我可以做类似的事情
if ! gem list <name>; then do_stuff; fi
Run Code Online (Sandbox Code Playgroud)
但是在命令行上使用测试echo $?表明gem list <name>无论是否实际找到名称都返回 0。
这是否意味着我必须使用 grep 来过滤 gem list 的输出,或者有没有更好的方法可以检查是否安装了 gem?
在系统范围的 RVM 中......这是我的 /etc/gemrc
---
gem:--no-ri --no-rdoc
Run Code Online (Sandbox Code Playgroud)
这是系统 gem env
GEM PATHS:
- /usr/lib/ruby/gems/1.9.1
- /home/${USER}/.gem/ruby/1.9.1
GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- "gem" => "--no-ri --no-rdoc"
Run Code Online (Sandbox Code Playgroud)
这是 rvm 中的那个
GEM PATHS:
- /usr/local/rvm/gems/ruby-1.9.2-p180
- /usr/local/rvm/gems/ruby-1.9.2-p180@global
GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
Run Code Online (Sandbox Code Playgroud)
和 rvm @global
GEM PATHS:
- …Run Code Online (Sandbox Code Playgroud) 我似乎无法开始gem install charlock_holmes -v 0.6.9.4工作。
我可以手动编辑./ext/charlock_holmes/extconf.rb并包括
$INCFLAGS << " -I/usr/local/include "
$LDFLAGS << " -L/usr/local/lib "
Run Code Online (Sandbox Code Playgroud)
make干净地执行并通过重写规范文件
gem spec ../../cache/charlock_holmes-0.6.9.4.gem --ruby > ../../specifications/charlock_holmes-0.6.9.4.gemspec
Run Code Online (Sandbox Code Playgroud)
并使其成为当地的瑰宝。
CPPFLAGS和LDFLAGS到 gem 安装。从一台服务器移动到另一台服务器时,我遇到了 redmine(或 ruby 配置)的问题
redmine@dirty:~/www$ ruby script/rails server webrick -e production
/usr/local/rvm/gems/ruby-2.0.0-p353/gems/mysql2-0.3.14/lib/mysql2.rb:8:in `require': Incorrect MySQL client library version! This gem was compiled for 5.5.17 but the client library is 5.1.59. (RuntimeError)
from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/mysql2-0.3.14/lib/mysql2.rb:8:in `<top (required)>'
from /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/bundler-1.5.2/lib/bundler/runtime.rb:76:in `require'
from /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/bundler-1.5.2/lib/bundler/runtime.rb:76:in `block (2 levels) in require'
from /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/bundler-1.5.2/lib/bundler/runtime.rb:72:in `each'
from /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/bundler-1.5.2/lib/bundler/runtime.rb:72:in `block in require'
from /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/bundler-1.5.2/lib/bundler/runtime.rb:61:in `each'
from /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/bundler-1.5.2/lib/bundler/runtime.rb:61:in `require'
from /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/bundler-1.5.2/lib/bundler.rb:131:in `require'
from /home/redmine/redmine-2.4/config/application.rb:7:in `<top (required)>'
from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/railties-3.2.16/lib/rails/commands.rb:53:in `require'
from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/railties-3.2.16/lib/rails/commands.rb:53:in `block in <top (required)>'
from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/railties-3.2.16/lib/rails/commands.rb:50:in `tap'
from /usr/local/rvm/gems/ruby-2.0.0-p353/gems/railties-3.2.16/lib/rails/commands.rb:50:in …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用厨师部署 Rails 应用程序,对于 mysql 食谱来创建数据库,它需要mysqlgem。所述mysql宝石安装系统范围通过使用Ubuntu的软件包,但是这不是通过使用chef-client从运行/opt/chef/embedded。
我试过添加这个:
chef_gem 'mysql' do
action :nothing
end.run_action(:install)
Run Code Online (Sandbox Code Playgroud)
但这需要libmysqlclient-dev安装 Ubuntu 包。因此我也在之前添加了这个:
package 'libmysqlclient-dev' do
action :nothing
end.run_action(:install)
Run Code Online (Sandbox Code Playgroud)
但这是在apt配方更新 apt 存储库之前完成的,因此安装libmysqlclient-dev失败。
这些“黑客”看起来很难看,我无法找到apt-get update在正确的时间运行它们的方法。
有人可以帮我找到正确的(最像厨师的)方法来解决我的问题(实际问题是使用application食谱创建数据库)?
我已经能够解决这个食谱的问题作为一个丑陋的黑客......我仍在寻找更好的解决方案:
execute "apt-get update" do
ignore_failure true
action :nothing
end.run_action(:run)
node.set['build_essential']['compiletime'] = true
include_recipe "build-essential"
%w{build-essential mysql-client libmysqlclient-dev}.each do |p|
package p do
action :nothing
end.run_action(:install)
end
chef_gem 'mysql' do
action :nothing
end.run_action(:install)
Run Code Online (Sandbox Code Playgroud)