Created
March 9, 2010 19:57
-
-
Save joshk/327032 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Don't change this file! | |
# Configure your app in config/environment.rb and config/environments/*.rb | |
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT) | |
module Rails | |
class << self | |
def boot! | |
unless booted? | |
preinitialize | |
pick_boot.run | |
end | |
end | |
def booted? | |
defined? Rails::Initializer | |
end | |
def pick_boot | |
(vendor_rails? ? VendorBoot : GemBoot).new | |
end | |
def vendor_rails? | |
File.exist?("#{RAILS_ROOT}/vendor/rails") | |
end | |
def preinitialize | |
load(preinitializer_path) if File.exist?(preinitializer_path) | |
end | |
def preinitializer_path | |
"#{RAILS_ROOT}/config/preinitializer.rb" | |
end | |
end | |
class Boot | |
def run | |
load_initializer | |
Rails::Initializer.run(:set_load_path) | |
end | |
end | |
class VendorBoot < Boot | |
def load_initializer | |
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer" | |
Rails::Initializer.run(:install_gem_spec_stubs) | |
Rails::GemDependency.add_frozen_gem_path | |
end | |
end | |
class GemBoot < Boot | |
def load_initializer | |
self.class.load_rubygems | |
load_rails_gem | |
require 'initializer' | |
end | |
def load_rails_gem | |
if version = self.class.gem_version | |
gem 'rails', version | |
else | |
gem 'rails' | |
end | |
rescue Gem::LoadError => load_error | |
$stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) | |
exit 1 | |
end | |
class << self | |
def rubygems_version | |
Gem::RubyGemsVersion rescue nil | |
end | |
def gem_version | |
if defined? RAILS_GEM_VERSION | |
RAILS_GEM_VERSION | |
elsif ENV.include?('RAILS_GEM_VERSION') | |
ENV['RAILS_GEM_VERSION'] | |
else | |
parse_gem_version(read_environment_rb) | |
end | |
end | |
def load_rubygems | |
min_version = '1.3.2' | |
require 'rubygems' | |
unless rubygems_version >= min_version | |
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.) | |
exit 1 | |
end | |
rescue LoadError | |
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org) | |
exit 1 | |
end | |
def parse_gem_version(text) | |
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/ | |
end | |
private | |
def read_environment_rb | |
File.read("#{RAILS_ROOT}/config/environment.rb") | |
end | |
end | |
end | |
end | |
# required for bundler | |
class Rails::Boot | |
def run | |
load_initializer | |
extend_environment | |
Rails::Initializer.run(:set_load_path) | |
end | |
def extend_environment | |
Rails::Initializer.class_eval do | |
old_load = instance_method(:load_environment) | |
define_method(:load_environment) do | |
Bundler.require :default, Rails.env.to_sym | |
old_load.bind(self).call | |
end | |
end | |
end | |
end | |
# All that for this: | |
Rails.boot! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# this is the generated environment file (bundler) | |
# DO NOT MODIFY THIS FILE | |
require 'digest/sha1' | |
require "rubygems" | |
module Gem | |
class Dependency | |
if !instance_methods.map { |m| m.to_s }.include?("requirement") | |
def requirement | |
version_requirements | |
end | |
end | |
end | |
end | |
module Bundler | |
module SharedHelpers | |
def default_gemfile | |
gemfile = find_gemfile | |
gemfile or raise GemfileNotFound, "The default Gemfile was not found" | |
Pathname.new(gemfile) | |
end | |
def in_bundle? | |
find_gemfile | |
end | |
private | |
def find_gemfile | |
return ENV['BUNDLE_GEMFILE'] if ENV['BUNDLE_GEMFILE'] | |
previous = nil | |
current = File.expand_path(Dir.pwd) | |
until !File.directory?(current) || current == previous | |
filename = File.join(current, 'Gemfile') | |
return filename if File.file?(filename) | |
current, previous = File.expand_path("..", current), current | |
end | |
end | |
def clean_load_path | |
# handle 1.9 where system gems are always on the load path | |
if defined?(::Gem) | |
me = File.expand_path("../../", __FILE__) | |
$LOAD_PATH.reject! do |p| | |
next if File.expand_path(p).include?(me) | |
p != File.dirname(__FILE__) && | |
Gem.path.any? { |gp| p.include?(gp) } | |
end | |
$LOAD_PATH.uniq! | |
end | |
end | |
def reverse_rubygems_kernel_mixin | |
# Disable rubygems' gem activation system | |
::Kernel.class_eval do | |
if private_method_defined?(:gem_original_require) | |
alias rubygems_require require | |
alias require gem_original_require | |
end | |
undef gem | |
end | |
end | |
def cripple_rubygems(specs) | |
reverse_rubygems_kernel_mixin | |
executables = specs.map { |s| s.executables }.flatten | |
:: Kernel.class_eval do | |
private | |
def gem(*) ; end | |
end | |
Gem.source_index # ensure RubyGems is fully loaded | |
::Kernel.send(:define_method, :gem) do |dep, *reqs| | |
if executables.include? File.basename(caller.first.split(':').first) | |
return | |
end | |
opts = reqs.last.is_a?(Hash) ? reqs.pop : {} | |
unless dep.respond_to?(:name) && dep.respond_to?(:requirement) | |
dep = Gem::Dependency.new(dep, reqs) | |
end | |
spec = specs.find { |s| s.name == dep.name } | |
if spec.nil? | |
e = Gem::LoadError.new "#{dep.name} is not part of the bundle. Add it to Gemfile." | |
e.name = dep.name | |
e.version_requirement = dep.requirement | |
raise e | |
elsif dep !~ spec | |
e = Gem::LoadError.new "can't activate #{dep}, already activated #{spec.full_name}. " \ | |
"Make sure all dependencies are added to Gemfile." | |
e.name = dep.name | |
e.version_requirement = dep.requirement | |
raise e | |
end | |
true | |
end | |
# === Following hacks are to improve on the generated bin wrappers === | |
# Yeah, talk about a hack | |
source_index_class = (class << Gem::SourceIndex ; self ; end) | |
source_index_class.send(:define_method, :from_gems_in) do |*args| | |
source_index = Gem::SourceIndex.new | |
source_index.spec_dirs = *args | |
source_index.add_specs(*specs) | |
source_index | |
end | |
# OMG more hacks | |
gem_class = (class << Gem ; self ; end) | |
gem_class.send(:define_method, :bin_path) do |name, *args| | |
exec_name, *reqs = args | |
spec = nil | |
if exec_name | |
spec = specs.find { |s| s.executables.include?(exec_name) } | |
spec or raise Gem::Exception, "can't find executable #{exec_name}" | |
else | |
spec = specs.find { |s| s.name == name } | |
exec_name = spec.default_executable or raise Gem::Exception, "no default executable for #{spec.full_name}" | |
end | |
File.join(spec.full_gem_path, spec.bindir, exec_name) | |
end | |
end | |
extend self | |
end | |
end | |
module Bundler | |
LOCKED_BY = '0.9.10' | |
FINGERPRINT = "db4abb560d2d27539be4342a921f55c516b4b273" | |
AUTOREQUIRES = {:default=>[["mysql", false]]} | |
SPECS = [ | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/activesupport-2.3.4.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/actionmailer-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/actionmailer-2.3.4.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/rack-1.0.1/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/rack-1.0.1.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/actionpack-2.3.4.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/mysql-2.8.1/lib", "/opt/local/lib/ruby/gems/1.8/gems/mysql-2.8.1/ext"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/mysql-2.8.1.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/rake-0.8.7.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/activerecord-2.3.4.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/activeresource-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/activeresource-2.3.4.gemspec"}, | |
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/rails-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/rails-2.3.4.gemspec"}, | |
].map do |hash| | |
spec = eval(File.read(hash[:loaded_from]), binding, hash[:loaded_from]) | |
spec.loaded_from = hash[:loaded_from] | |
spec.require_paths = hash[:load_paths] | |
spec | |
end | |
extend SharedHelpers | |
def self.match_fingerprint | |
print = Digest::SHA1.hexdigest(File.read(File.expand_path('../../Gemfile', __FILE__))) | |
unless print == FINGERPRINT | |
abort 'Gemfile changed since you last locked. Please `bundle lock` to relock.' | |
end | |
end | |
def self.setup(*groups) | |
match_fingerprint | |
clean_load_path | |
cripple_rubygems(SPECS) | |
SPECS.each do |spec| | |
Gem.loaded_specs[spec.name] = spec | |
$LOAD_PATH.unshift(*spec.require_paths) | |
end | |
end | |
def self.require(*groups) | |
groups = [:default] if groups.empty? | |
groups.each do |group| | |
(AUTOREQUIRES[group] || []).each do |file, explicit| | |
if explicit | |
Kernel.require file | |
else | |
begin | |
Kernel.require file | |
rescue LoadError | |
end | |
end | |
end | |
end | |
end | |
# Setup bundle when it's required. | |
setup | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
source :gemcutter | |
gem 'rails', '2.3.4', :require => nil | |
gem 'mysql' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
➜ bundler_test bundle lock | |
The bundle is now locked. Use `bundle show` to list the gems in the environment. | |
➜ bundler_test bundle install | |
Installing actionmailer (2.3.4) from system gems | |
Installing actionpack (2.3.4) from system gems | |
Installing activerecord (2.3.4) from system gems | |
Installing activeresource (2.3.4) from system gems | |
Installing activesupport (2.3.4) from system gems | |
Installing mysql (2.8.1) from system gems | |
Installing rack (1.0.1) from system gems | |
Installing rails (2.3.4) from system gems | |
Installing rake (0.8.7) from system gems | |
Your bundle is complete! | |
➜ bundler_test bundle exec rake routes | |
/opt/local/bin/rake:19:in `load': no such file to load -- rake (LoadError) | |
from /opt/local/bin/rake:19 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
begin | |
# Require the preresolved locked set of gems. | |
require File.expand_path('../../.bundle/environment', __FILE__) | |
rescue LoadError | |
# Fallback on doing the resolve at runtime. | |
require "rubygems" | |
require "bundler" | |
if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.5") | |
raise RuntimeError, "Bundler incompatible.\n" + | |
"Your bundler version is incompatible with Rails 2.3 and an unlocked bundle.\n" + | |
"Run `gem install bundler` to upgrade or `bundle lock` to lock." | |
else | |
Bundler.setup | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment