rails从4.0.2降到3.2.9
初学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的更多相关文章
- 墙国内新建Rails应用的要点(windows 7环境, Rails 4.2.0)
1. 使用rails new 命令创建完的应用在自动执行bundle install不会成功,根据出错提示,判断原因有可能是被墙与https的证书的安全性问题. 作为开发环境,选用绕开的办法,在目录 ...
- iPhone 3gs 5.0.1降級到4.3.3 昨晚搞定(有shsh備份)
經過昨天白天一天的學習和準備,終於一次降級成功. 手機未降級時狀態: 無鎖港版 3GS 16G 固件:5.0.1 基帶:05.16.05 記錄且分享降級完整步驟: 準備以下軟件.工具 官網固件 ...
- 【RoR win32】新rails运行后0.0.0.0:3000不能访问
在浏览器中使用127.0.0.1:3000来访问
- 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_170 2020年,"非著名Web框架"–Ruby on Rails已经15岁了.在今年,Rails 6.0趋于 ...
- rails
http://ruby-toolbox.com/ ~/.gemrc --- :backtrace: false :benchmark: false :bulk_threshold: 1000 :sou ...
- Ruby on Rails 接口无法调试的问题
1. 客户端 ip 与服务器 ip需要在同一网段 2. 如果 rails 版本是4.2及以上需要通过 rails s -b 0.0.0.0启动 3. 跑服务的mac需要关闭防火墙
- Ruby On Rails环境搭建
注:现在http://rubyforge.org 网站已经停止运行,取而代之的是https://rubygems.org这个网站,下文中所需要的gem包都可以去这个网站搜索下载.其他完全按照下文说的去 ...
- 帝国CMS 6.0功能解密之新版结合项功能,帝国结合项使用
可以用来做A-Z信息检索 某字段等于多少,输出 等等 帝国CMS6.0在继承以往版本结合项功能的基础上又新增很多特性,更强大.今天我们就专门来讲解6.0的结合项改进. 回顾下以往版本的结合项语 ...
- macos下使用rvm管理ruby版本和rails版本
1. 安装rvm curl -L https://get.rvm.io | bash -s stable 查看rvm 版本 2. 安装ruby rvm install 2.3.1 查看ruby 版本 ...
随机推荐
- Atitit.auto complete 自动完成控件的实现总结
Atitit.auto complete 自动完成控件的实现总结 1. 框架选型 1 2. 自动完成控件的ioc设置 1 3. Liger 自动完成控件问题 1 4. 官网上的code有问题,不能 ...
- js程序设计01——基本概念
本文为js高级程序设计学习笔记,笔记中不乏本人学习js的一些心得demo,喜欢的朋友可以直接参考原书“javascript高级程序设计”,写本笔记的目的是对js中容易出错.不易理解的地方作个笔记,以免 ...
- hdu 1087 动态规划之最长上升子序列
http://acm.hdu.edu.cn/showproblem.php?pid=1087 Online Judge Online Exercise Online Teaching Online C ...
- 在jsp中重复定义了两个相同id的标签导致的错误
jQuery做前台开发的程序有一个页面在IE11和谷歌浏览器下都没有问题,但是在XP的IE8下运行就报错: 后来发现是定义了两个相同id的标签所致. 在icCard.jsp中定义的标签: 在carIn ...
- 如何编写一个PHP的C扩展
为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多.同样的运算代码,使用C来开发,性能会比PHP要提升数百倍.IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势. 另外C扩 ...
- 软件设计之UML—UML的构成[上]
UML是一种通用的建模语言,其表达能力相当的强,不仅可以用于软件系统的建模,而且可用于业务建模以及其它非软件系统建模.UML综合了各种面向对象方法与表示法的优点,至提出之日起就受到了广泛的重视并得 ...
- java string转为xml
一.使用最原始的javax.xml.parsers,标准的jdk api // 字符串转XML String xmlStr = \"......\"; StringReader s ...
- Think in java 4th读书笔记__last update20151130
一周至少两章,去掉最后的并发和图形化用户界面,刚好需要2个半月才能学好.这进度感觉有点慢,所以做下调整吧,改成一个月会不会更好点^^,认认真真的把java的圣经给看一遍. 计划: 第1~6 11.17 ...
- Nodejs npm安装socket.io报错解决办法
安装socket.io时,报错,提示需要安装Microsoft visual studio 2005 或 Net framework 2.0 sdk,没有找到vcbuild.exe,解决办法是安装 . ...
- React直出实现与原理
前一篇文章我们介绍了虚拟DOM的实现与原理,这篇文章我们来讲讲React的直出. 比起MVVM,React比较容易实现直出,那么React的直出是如何实现,有什么值得我们学习的呢? 为什么MVVM不能 ...