Rails源码阅读(11)Rails使用bundle保持多机器环境gem版本的一致性
====rails3====
文件conf/book.rb
require 'rubygems' # Set up gems listed in the Gemfile. ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
require 'rubygems' #这个ruby1。9后已经不需要了
后面的几句就是启动bundle,把gem包加载进来。
熟悉ruby包加载原理的,估计能猜出来bundle和Gemfile都做了啥,就是把用到的包路径加载进ruby寻找的路径中,从而在使用某个rb文件的时候,可以从某个路径下面找出来。
让我们验证一下吧。
文件bundler/setup
require 'bundler/shared_helpers' if Bundler::SharedHelpers.in_bundle? require 'bundler' if STDOUT.tty? begin Bundler.setup rescue Bundler::BundlerError => e puts "\e[31m#{e.message}\e[0m" puts e.backtrace.join("\n") if ENV["DEBUG"] if Bundler::GemNotFound === e puts "\e[33mRun `bundle install` to install missing gems.\e[0m" end exit e.status_code end else Bundler.setup end # Add bundler to the load path after disabling system gems bundler_lib = File.expand_path("../..", __FILE__) $LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib) end
这个文件核心就这一句:Bundler.setup
文件bundler。rb
。。。 。。。 def setup(*groups) # Just return if all groups are already loaded return @setup if defined?(@setup) if groups.empty? # Load all groups, but only once @setup = load.setup else @completed_groups ||= [] # Figure out which groups haven't been loaded yet unloaded = groups - @completed_groups # Record groups that are now loaded @completed_groups = groups unloaded.any? ? load.setup(*groups) : load end end def require(*groups) setup(*groups).require(*groups) end def load @load ||= Runtime.new(root, definition) end 。。。 。。。
这个文件比较大,是用来加载Gemfile.lock中的gem的。详细的类太多了,先跳出吧。
看看加载的结果:
irb
1.9.3p194 :002 > puts $:
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/x86_64-linux
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1/x86_64-linux
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-linux
1.9.3p194 :003 > require "./config/boot.rb"
=> true
1.9.3p194 :004 > puts $:
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/uglifier-2.1.2/lib
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/thin-1.5.1/lib
... ...
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/activemodel-3.2.13/lib
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/builder-3.0.4/lib
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/activesupport-3.2.13/lib
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/multi_json-1.7.9/lib
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/i18n-0.6.1/lib
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/rake-10.1.0/lib
/usr/share/ruby-rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.1.5/lib
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/x86_64-linux
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1/x86_64-linux
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1
/usr/share/ruby-rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-linux
看结果,都加载进来了,而且版本都是跟Gemfile.lock中一致的。
加载的时候,是必须有版本的,虽然Gemfile有很多gem我们不指定版本,或者不指定精确版本。
至此,rails是怎么使用bundle的,以及bundle大概干了什么事情,就清楚了。
从这些源码也可以扩展,如果我们的项目(不是rails项目),想用bundle来维持版本的一致性,怎么使用和价值bundle,自然跟这里类似了。
Bundle官网就介绍了使用,使用上跟上面的几乎一致。
require 'rubygems' require 'bundler/setup'
+
+
+
=
+
+
+
相关推荐
ROR安装的最版本的GEM,ruby on rails即ROR
ruby on rails 教程源码,配合原书使用
使用Ruby On Rails开发时经常需要Bundle Install 但有些环境网络太慢或无法连接外网的时候就需要离线Bundle 该压缩包包括52个gem 其中有sqlite3,tzinfo-data等等
Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0) 3.0,3.1,3.2,4.0
rails on ruby 4.1.2相关的GEM安装包
版本为:rails-2.3.8.gem 可使用指令安装:gem install rails-2.3.8.gem
rails-exporter-源码.rar
rails-2.3.5.gem redmine必须gem
一个用Ruby on Rails搭建的图片分享的网站项目.完整源代码
如果无法通过网络升级rail,可以通过本地安装包进行安装,内有使用说明
2.进入rails目录使用gem命令安装(这一步必须要上一步已经安装成功)。如果安装不成功使用ruby,如下: ruby -S gem install rails-2.2.2.gem 3.复制libmySQL.dll到ruby的安装目录的bin文件夹下,然后使用gem安装...
解决 Rails bundle 安装不上 mysql gem包的问题 环境 ubuntu 12.04 ruby-2.1.1 首先 新建一个的一个项目,在该项目上执行 bundle install 提示 代码如下: … Make sure that gem install mysql2 -v ‘0.3.16’; ...
adminlte-rails, AdminLTE Rails gem 将AdminLTE主题与 Rails 资产管道集成 AdminLTE Rails gem AdminLTE 是后端的高级 Bootstrap 主题。英镑 AdminLTE Rails gem 与 Rails 资产管道集成了英镑AdminLTE主题。安装将...
jquery-rails, 一个 gem,用于自动使用jQuery和 Rails 3 railsjQuery 面向 Rails 如此伟大。这里 gem 提供:jQuery 1.7.2jQuery UI 1.8.18 ( 仅适用于 javascript )jQuery UJS适配器assert_select_j
rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的Collection 组装 Rails 应用程序。"你可以使用 rails_...
ruby on rail的rails的gem,版本2.1.0
jquery-datatables-rails, 用于 Rails的jquery数据表 gem jquery-datatables-rails 这个 gem 为 jQuery DataTables插件提供了方便,以便与 Rails 资产pipleine结合使用。 它提供所有基本的datatable文件,以及一些...
ruby on rails社区网站开发源码
是我搭建redmine过程中所使用到的资源,因为感到很多东西不太好找,所以给上传上来,供自己和大家使用。
ruby on rails 版本2.1.0 gem 包