初学ruby和rails,想和教程同步,把rails的版本降下来。从4.0.2降到3.2.9

[lucas@lucas ~]$ rails -v
Rails 4.0.2

尝试了 sudo gem uninstall rails,告诉我的结果是:

[lucas@lucas ~]$ sudo gem uninstall rails
Successfully uninstalled rails-4.0.2

重新rails -v  结果还是 4.0.2。

于是重新装个3.9.2吧

$ sudo gem install rails -v 3.9.2

下载完成之后依旧是4.0.2的版本

想个办法把版本替换掉就好了,先看看rails指令的路径

$ whereis rails

rails: /usr/local/bin/rails

打开这个文件 /usr/local/bin/rails

load Gem.bin_path('railties', 'rails', version)

最后一句话就是调用启动脚本的。于是去gem中找到这个方法。

在 /usr/local/lib/ruby/1.9.1/rubygems.rb 中

  def self.bin_path(name, exec_name = nil, *requirements)

...
specs = Gem::Dependency.new(name, requirements).matching_specs(true) ...
unless spec = specs.last
msg = "can't find gem #{name} (#{requirements}) with executable #{exec_name}"
raise Gem::GemNotFoundException, msg
end spec.bin_file exec_name
end
specs = Gem::Dependency.new(name, requirements).matching_specs(true) 这一步获得了地址
于是去到 Dependency中
/usr/local/lib/ruby/1.9.1/rubygems/dependency.rb
  def matching_specs platform_only = false
matches = Gem::Specification.find_all { |spec|
self.name === spec.name and # TODO: == instead of ===
requirement.satisfied_by? spec.version
}
... matches = matches.sort_by { |s| s.sort_obj } # HACK: shouldn't be needed
end

可以看到是Gem::Specification.find_all 中找到了对应的路径

于是去Specification中

/usr/local/lib/ruby/1.9.1/rubygems/specification.rb

调用的是Gem::Specification.find_all,想着Gem::Specification应该是 extend Enumerable了,于是去找了def each

  def self.each
return enum_for(:each) unless block_given? self._all.each do |x|
yield x
end
end

看来一切都在 self._all里面了。

  def self._all # :nodoc:
unless defined?(@@all) && @@all then
specs = {} self.dirs.each { |dir|
Dir[File.join(dir, "*.gemspec")].each { |path|
spec = Gem::Specification.load path.untaint
# #load returns nil if the spec is bad, so we just ignore
# it at this stage
specs[spec.full_name] ||= spec if spec
}
} @@all = specs.values _resort!
end
@@all
end

果然 是从 self.dirs 中获得的路径,在self.dirs中

  def self.dirs
@@dirs ||= Gem.path.collect { |dir|
File.join dir, "specifications"
}
end

dirs 是通过Gem.path和“specifications” 组合之后获得的路径

输出了一下Gem.path 可以得到

["/usr/local/lib/ruby/gems/1.9.1","/home/username/.gem/ruby/1.9.1"]

所以最终的路径在"/usr/local/lib/ruby/gems/1.9.1/specifications","/home/username/.gem/ruby/1.9.1/specifications"中

第二个路径是空的。只能在第一个路径中,在第一个路径中发现存在

railties-4.0.2.gemspec  railties-3.2.9.gemspec

把第一个改成railties-4.0.2.gemspec.bak之后,在rails -v 就可以看到改成了想要的版本。如果想用4.0.2的版本,把名字改回来就好了。


总的来说呢,很简单。

1. sudo gem install rails -v 3.2.9

2. 去"/usr/local/lib/ruby/gems/1.9.1/specifications"或"/home/username/.gem/ruby/1.9.1/specifications"中,
    将railties-4.0.2.gemspec 改成railties-4.0.2.gemspec.bak

这是一个指标不治本的方法,只是改变了rails指令的调用路径而已,并没有将4.0.2版本删掉

												

rails从4.0.2降到3.2.9的更多相关文章

  1. 墙国内新建Rails应用的要点(windows 7环境, Rails 4.2.0)

    1. 使用rails new 命令创建完的应用在自动执行bundle install不会成功,根据出错提示,判断原因有可能是被墙与https的证书的安全性问题. 作为开发环境,选用绕开的办法,在目录  ...

  2. iPhone 3gs 5.0.1降級到4.3.3 昨晚搞定(有shsh備份)

    經過昨天白天一天的學習和準備,終於一次降級成功. 手機未降級時狀態: 無鎖港版   3GS 16G  固件:5.0.1  基帶:05.16.05 記錄且分享降級完整步驟: 準備以下軟件.工具 官網固件 ...

  3. 【RoR win32】新rails运行后0.0.0.0:3000不能访问

    在浏览器中使用127.0.0.1:3000来访问

  4. 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_170 2020年,"非著名Web框架"–Ruby on Rails已经15岁了.在今年,Rails 6.0趋于 ...

  5. rails

    http://ruby-toolbox.com/ ~/.gemrc --- :backtrace: false :benchmark: false :bulk_threshold: 1000 :sou ...

  6. Ruby on Rails 接口无法调试的问题

    1. 客户端 ip 与服务器 ip需要在同一网段 2. 如果 rails 版本是4.2及以上需要通过 rails s -b 0.0.0.0启动 3. 跑服务的mac需要关闭防火墙

  7. Ruby On Rails环境搭建

    注:现在http://rubyforge.org 网站已经停止运行,取而代之的是https://rubygems.org这个网站,下文中所需要的gem包都可以去这个网站搜索下载.其他完全按照下文说的去 ...

  8. 帝国CMS 6.0功能解密之新版结合项功能,帝国结合项使用

    可以用来做A-Z信息检索    某字段等于多少,输出  等等 帝国CMS6.0在继承以往版本结合项功能的基础上又新增很多特性,更强大.今天我们就专门来讲解6.0的结合项改进. 回顾下以往版本的结合项语 ...

  9. macos下使用rvm管理ruby版本和rails版本

    1. 安装rvm curl -L https://get.rvm.io | bash -s stable 查看rvm 版本 2. 安装ruby rvm install 2.3.1 查看ruby 版本 ...

随机推荐

  1. atitit.提升开发效率---MDA 软件开发方式的革命(5)----列表查询建模

    )----列表查询建模 1. 配置条件字段@Conditional 1 2. 配置条件字段显示类型为range----@Conditional(displayType = displayType.ra ...

  2. paip.解决 数据库mysql增加列 字段很慢添加字段很慢

    paip.解决 数据库mysql增加列 字段很慢添加字段很慢 #环境如下: mysql5.6    数据仅仅3w alter table xxx add column yyy int default ...

  3. iOS开发——高级技术&系统应用于系统服务

    系统应用于系统服务 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的 ...

  4. 雅虎Yahoo 前段优化 14条军规

    Yahoo 14条 雅虎十四条 腾讯前端设计的Leader推荐我背熟的.请大家都能好好学习,不要像我一样一扫而过,好好的记下来!不仅仅是晓得一些CSS xhtml就好了,深刻认识到很多的东西需要学习的 ...

  5. Struts2学习笔记-基本结构

    一个普通的的web应用文件结构如下: 1. 最上层是应用名,区分大小写,在浏览器输入应用名的时候,必须与应用名的大小一样,例如:localhost:8080/HelloWorld 2. 在应用下,放有 ...

  6. mysql忘记密码重置(mac)

    setp1: 苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击stop mysql server) step2:进入终端输入:cd /usr/local/ ...

  7. web应用程序 ---- 日志系统的设计

    最近在做一个小的项目,是web的应用程序,最近也有点时间,把日志管理来简单的说说. 日志,就是需要记录一些自己感兴趣的信息,把它保存起来,具体保存在哪里?保存多长时间?这些要求都是根据不同的项目需求而 ...

  8. GO語言基礎教程:Hello world!

    首先簡單地說一下GO語言的環境安裝,從 http://golang.org/dl/ 針對自己的操作系統選擇合適的安裝包,然後下載安裝即可,下載的時候注意別選錯了的操作系統,例如go1.3.1.darw ...

  9. 转:Media Player Classic - HC 源代码分析

    VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...

  10. CMD command

    过滤字符串查找:netstat -aon|findstr "80"