`
fantaxy025025
  • 浏览: 1346331 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Rails源码阅读(11)Rails使用bundle保持多机器环境gem版本的一致性

 
阅读更多

 

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官网就介绍了使用,使用上跟上面的几乎一致。

http://bundler.io/

Inside your app, load up the bundled environment:
require 'rubygems' 

require 'bundler/setup'

 

+

+

+

=

+

+

+

 

分享到:
评论

相关推荐

    基于ruby on rails开发示例源码

    2. **Gemfile.lock**:记录项目的精确gem版本,确保在不同环境中部署时保持一致性。 3. **config/**:配置文件夹,包含数据库配置、路由设置(routes.rb)、应用配置等。 4. **db/**:数据库相关文件,如数据库...

    rails2.1與Oracle 連結所需gem

    标题“rails2.1与Oracle连接所需gem”指的是在Rails 2.1版本的应用程序中,如何配置和使用Oracle数据库的宝石(gem)扩展。Rails是Ruby on Rails框架的简称,是一个流行的开源Web应用程序框架,而Oracle则是一种企业...

    rails入门详细笔记

    - 安装完成后需要使用 `gem update` 命令更新 RubyGems 至最新版本,以确保能够顺利安装 Rails 及其他必要的 gems。 3. **数据库选择**: - 默认情况下 Rails 支持 SQLite3 数据库,但用户可以根据需求选择 MySQL...

    让脚手架直接生成Haml模板

    标签中的“源码”意味着这涉及到对项目源代码的修改,而“工具”则表明我们正在讨论的是开发工具的使用和定制。 通过这种方式,开发者可以享受到Haml带来的好处,如更整洁的代码结构,减少冗余的HTML标签,以及更好...

    redmine-4.2.4.tar.gz

    - 将Redmine部署到云原生环境中,可以采用Docker容器化技术,打包应用及其依赖,确保跨平台一致性。 - 使用Kubernetes或Docker Swarm等容器编排工具,可以轻松实现Redmine的横向扩展、故障恢复和自动调度。 - ...

    polaris_view_helpers:用于Shopify Polaris的Rails视图助手

    开发者可以通过阅读源码了解如何具体使用这些视图助手。`spec`目录下的测试文件可以帮助理解每个助手的功能和预期行为。如果存在`example`或`demo`目录,那么里面可能有示例应用或者代码片段,展示如何在实际项目中...

    sandbrook-library

    通过`bundle install`命令,开发者可以安装所有必要的库,确保环境一致性。 2. **Gemfile.lock**:记录具体版本的gem,确保在不同环境中使用相同版本的库,避免因gem版本差异导致的问题。 3. **config**目录:包含...

    demo_app:演示微博

    - `Gemfile.lock`:锁定当前Gem的版本,确保在不同环境下的一致性。 - `config`目录:包含应用配置文件,如`database.yml`(数据库配置)和`routes.rb`(路由配置)。 - `app`目录:包含模型、控制器、视图和其他...

    acts_as_nested_set的增强版BetterNestedSet

    - **兼容性提升**:支持Rails的更新版本,解决了旧版acts_as_nested_set在新环境下可能出现的问题。 - **灵活的配置**:允许自定义左值和右值字段名,以及额外的辅助字段,以适应不同的需求。 4. 使用示例 - ...

    woof

    2. `Gemfile.lock`:记录了具体版本的gem,确保在不同环境下的一致性。 3. `app/`:包含了应用的核心代码,如模型(model)、控制器(controller)、视图(view)和助手(helper)。 4. `config/`:存储了应用的配置信息,如...

    家庭作业

    9. **Gemfile.lock**:记录具体版本的Gem,确保不同环境下的依赖一致性。 通过这个项目,学习者可以实践数据库操作、路由配置、控制器编写、视图渲染、模型关联以及测试等技能。此外,理解Rails的生命周期、学习...

    mixerbyte.com

    `Gemfile.lock`会列出确切的依赖版本,确保在不同环境中的一致性。如果项目使用了Rails,那么`config/routes.rb`将定义URL路由,而`app/controllers`和`app/models`将分别包含业务逻辑和数据模型。 为了运行项目,...

    ap-2020

    10. **Gemfile.lock**:记录了项目当前使用的Gem版本,确保在不同环境下的依赖一致性。 通过分析这个项目的源码,你可以学习到Ruby的基本语法、面向对象编程、错误处理、文件I/O、网络编程、数据库操作等知识,以及...

Global site tag (gtag.js) - Google Analytics