Gem 请教几个关于 gem 依赖的问题

feitian124 · 2012年03月01日 · 最后由 huacnlee 回复于 2012年03月02日 · 4680 次阅读

我的环境: 我的机器上用的是 ubuntu 11, 然后用 rvm, rvm 中只有一个 ruby,就是 1.9.2。 然后就是用 gem 装了些框架如 rails, 直接用 gemset install XXX.或者从 github 上 fork 下来一些项目学习,用 bundle 也 install 也一些东西。

今天我尝试装一个 ruby 的 cms 系统 refinerycms,装好之后用这个 command 时报错:

$refinerycms
/home/ming/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:1615:in `raise_if_conflicts': Unable to activate sass-rails-3.2.4, because railties-3.1.3 conflicts with railties (~> 3.2.0) (Gem::LoadError)
                           ***      ***
    from /home/ming/.rvm/gems/ruby-1.9.2-p290/bin/refinerycms:18:in `<main>'
$gem list railties

*** LOCAL GEMS ***

railties (3.2.1, 3.1.3, 3.1.1, 3.0.5)

这里有疑问 1: 我不是这里有 3.2.1 吗,错误信息里怎么说 because railties-3.1.3 conflicts with railties (~> 3.2.0)

然后我尝试删掉 3.1.3,但发现 rails3.1.3 依赖于它,

rails-3.1.3 depends on [railties (= 3.1.3)]

而我 rails3.1.3 还想保留,那这个也不能删。 这里有疑问 2: 我这个问题怎么解决?rvm 那个 gemset 就是使用在这种场景么?

还是入门阶段,很多东西一知半解,望大侠不吝赐教。谢谢先。

共收到 10 条回复

步骤依次如下:

1、在项目根目录下面创建一个.rvmrc 文件,指定你要使用的 gem 集合,这样就不需要去删除你的其他 rails 版本,比如: rvm use 1.9.2@refinerycms --create

2、然后在根目录下面,安装 bundle 这个 gem 之后,运行:

bundle install

@ouyang #1 你的意思是从 gem 中找到 refinerycms 的所有依赖,然后添加到.rvmrc 中去。同时建一个 rvm gemset,然后在项目根目录中用 bundle install 安装那些 gem 到我刚才创的那个 gemset 中去?

还有一点不太理解,.rvmrc 不是 rvm 用的嘛,bundle 需要一个 Gemfile,那还要 copy 一份到 Gemfile 中? 这是标准做法么?感觉有点乱。。。

#2 楼 @feitian124 你的理解搞得太复杂了。

.rvmrc 文件是用于让 rvm 知道这个 rails 项目使用的是哪个 gemset。

rvm use 1.9.2@refinerycms --create

create 命令帮你自动创建了一个 rvm gemset。然后这时,你用 gem list 查看,发现所有 gem 都是空的,所以,我们使用:gem install bundle,安上包管理工具。

然后在你 clone 下来的 refinerycms,按照指示,生成的根目录下面,应该有一个 gemfile,此时,bundle 会自动去安装相应的 gem。

Gem 出现依赖问题那是因为你没有用 Bundler 和 RVM,有了这两个东西以后再也不会有依赖问题了。

#4 楼 @huacnlee refinerycms 是个命令行生成器,看来得用 gemset 了

我还从来没用过 gemset ,哈哈哈

#3 @ouyang 懂你的意思了。 我是按照 refinerycms 的官方 guide 做的,直接 gem install refinerycms。gem 不是应该会自动找到依赖并安装好下载吗?不懂为什么会有问题。 我晚上用你说的方法再去试下,但不知道能否找到源码 clone。。。

#4 @huacnlee 我已经在用 RVM 了. 顺便问问,gem 和 bundler 的就是如下区别吧: gem 是管理单个 gem 和它的依赖。 bundle 是管理 gemfile 中的多个 gem 和他们各自的依赖。

回复某一楼咋弄的?测试下 #7 #reply7

#8 楼 @feitian124 弱爆了。。点右边的灰色小箭头

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册