1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/railties/lib/tasks/gems.rake
David Dollar 599f2cfb4a Attempt to deal with more cases of gems with native components.
This commit adds a rudimentary check for 'unbuilt' gems, so that we can abort
the application load if there are any gems that have native components that
have not yet been built.

The rake task gems:build has now only builds 'unbuilt' gems as a result.

The rake task gems:build:force has been added to deal with cases of incomplete
builds, or any case where you need to force the build of all of your gems.

Changes the gems:build task to get its gem list by parsing directory entries
in vendor/gems, which sidesteps the chicken/egg issues involved with having a
gem unpacked into vendor/gems without before its native bits are compiled.

[#2266 state:committed]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
2009-04-28 23:16:47 -07:00

79 lines
2 KiB
Ruby

desc "List the gems that this rails application depends on"
task :gems => 'gems:base' do
Rails.configuration.gems.each do |gem|
print_gem_status(gem)
end
puts
puts "I = Installed"
puts "F = Frozen"
puts "R = Framework (loaded before rails starts)"
end
namespace :gems do
task :base do
$gems_rake_task = true
require 'rubygems'
require 'rubygems/gem_runner'
Rake::Task[:environment].invoke
end
desc "Build any native extensions for unpacked gems"
task :build do
$gems_build_rake_task = true
frozen_gems.each &:build
end
namespace :build do
desc "Force the build of all gems"
task :force do
$gems_build_rake_task = true
Rake::Task['gems:unpack'].invoke
current_gems.each { |gem| gem.build(:force => true) }
end
end
desc "Installs all required gems."
task :install => :base do
current_gems.each &:install
end
desc "Unpacks all required gems into vendor/gems."
task :unpack => :install do
current_gems.each &:unpack
end
namespace :unpack do
desc "Unpacks all required gems and their dependencies into vendor/gems."
task :dependencies => :install do
current_gems.each { |gem| gem.unpack(:recursive => true) }
end
end
desc "Regenerate gem specifications in correct format."
task :refresh_specs => :base do
current_gems.each &:refresh
end
end
def current_gems
gems = Rails.configuration.gems
gems = gems.select { |gem| gem.name == ENV['GEM'] } unless ENV['GEM'].blank?
gems
end
def frozen_gems
Dir[File.join(RAILS_ROOT, 'vendor', 'gems', '*-*')].map do |gem_dir|
Rails::GemDependency.from_directory_name(gem_dir)
end
end
def print_gem_status(gem, indent=1)
code = case
when gem.framework_gem? then 'R'
when gem.frozen? then 'F'
when gem.installed? then 'I'
else ' '
end
puts " "*(indent-1)+" - [#{code}] #{gem.name} #{gem.requirement.to_s}"
gem.dependencies.each { |g| print_gem_status(g, indent+1) }
end