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'
+
+
+
=
+
+
+
相关推荐
2. **Gemfile.lock**:记录项目的精确gem版本,确保在不同环境中部署时保持一致性。 3. **config/**:配置文件夹,包含数据库配置、路由设置(routes.rb)、应用配置等。 4. **db/**:数据库相关文件,如数据库...
标题“rails2.1与Oracle连接所需gem”指的是在Rails 2.1版本的应用程序中,如何配置和使用Oracle数据库的宝石(gem)扩展。Rails是Ruby on Rails框架的简称,是一个流行的开源Web应用程序框架,而Oracle则是一种企业...
- 安装完成后需要使用 `gem update` 命令更新 RubyGems 至最新版本,以确保能够顺利安装 Rails 及其他必要的 gems。 3. **数据库选择**: - 默认情况下 Rails 支持 SQLite3 数据库,但用户可以根据需求选择 MySQL...
标签中的“源码”意味着这涉及到对项目源代码的修改,而“工具”则表明我们正在讨论的是开发工具的使用和定制。 通过这种方式,开发者可以享受到Haml带来的好处,如更整洁的代码结构,减少冗余的HTML标签,以及更好...
- 将Redmine部署到云原生环境中,可以采用Docker容器化技术,打包应用及其依赖,确保跨平台一致性。 - 使用Kubernetes或Docker Swarm等容器编排工具,可以轻松实现Redmine的横向扩展、故障恢复和自动调度。 - ...
开发者可以通过阅读源码了解如何具体使用这些视图助手。`spec`目录下的测试文件可以帮助理解每个助手的功能和预期行为。如果存在`example`或`demo`目录,那么里面可能有示例应用或者代码片段,展示如何在实际项目中...
通过`bundle install`命令,开发者可以安装所有必要的库,确保环境一致性。 2. **Gemfile.lock**:记录具体版本的gem,确保在不同环境中使用相同版本的库,避免因gem版本差异导致的问题。 3. **config**目录:包含...
- `Gemfile.lock`:锁定当前Gem的版本,确保在不同环境下的一致性。 - `config`目录:包含应用配置文件,如`database.yml`(数据库配置)和`routes.rb`(路由配置)。 - `app`目录:包含模型、控制器、视图和其他...
- **兼容性提升**:支持Rails的更新版本,解决了旧版acts_as_nested_set在新环境下可能出现的问题。 - **灵活的配置**:允许自定义左值和右值字段名,以及额外的辅助字段,以适应不同的需求。 4. 使用示例 - ...
2. `Gemfile.lock`:记录了具体版本的gem,确保在不同环境下的一致性。 3. `app/`:包含了应用的核心代码,如模型(model)、控制器(controller)、视图(view)和助手(helper)。 4. `config/`:存储了应用的配置信息,如...
9. **Gemfile.lock**:记录具体版本的Gem,确保不同环境下的依赖一致性。 通过这个项目,学习者可以实践数据库操作、路由配置、控制器编写、视图渲染、模型关联以及测试等技能。此外,理解Rails的生命周期、学习...
`Gemfile.lock`会列出确切的依赖版本,确保在不同环境中的一致性。如果项目使用了Rails,那么`config/routes.rb`将定义URL路由,而`app/controllers`和`app/models`将分别包含业务逻辑和数据模型。 为了运行项目,...
10. **Gemfile.lock**:记录了项目当前使用的Gem版本,确保在不同环境下的依赖一致性。 通过分析这个项目的源码,你可以学习到Ruby的基本语法、面向对象编程、错误处理、文件I/O、网络编程、数据库操作等知识,以及...