Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, 2014. Read more
# File rubygems/commands/unpack_command.rb, line 10 def initialize super 'unpack', 'Unpack an installed gem to the current directory', :version => Gem::Requirement.default, :target => Dir.pwd add_option('--target=DIR', 'target directory for unpacking') do |value, options| options[:target] = value end add_version_option end
# File rubygems/commands/unpack_command.rb, line 35 def download dependency found = Gem::SpecFetcher.fetcher.fetch dependency return if found.empty? spec, source_uri = found.first Gem::RemoteFetcher.fetcher.download spec, source_uri end
# File rubygems/commands/unpack_command.rb, line 50 def execute get_all_gem_names.each do |name| dependency = Gem::Dependency.new name, options[:version] path = get_path dependency if path then basename = File.basename path, '.gem' target_dir = File.expand_path basename, options[:target] FileUtils.mkdir_p target_dir Gem::Installer.new(path, :unpack => true).unpack target_dir say "Unpacked gem: '#{target_dir}'" else alert_error "Gem '#{name}' not installed." end end end
Return the full path to the cached gem file matching the given name and version requirement. Returns 'nil' if no match.
Example:
get_path 'rake', '> 0.4' # "/usr/lib/ruby/gems/1.8/cache/rake-0.4.2.gem" get_path 'rake', '< 0.1' # nil get_path 'rak' # nil (exact name required)
# File rubygems/commands/unpack_command.rb, line 84 def get_path dependency return dependency.name if dependency.name =~ /\.gem$/i specs = Gem.source_index.search dependency selected = specs.sort_by { |s| s.version }.last return download(dependency) if selected.nil? return unless dependency.name =~ /^#{selected.name}$/i # We expect to find (basename).gem in the 'cache' directory. Furthermore, # the name match must be exact (ignoring case). filename = selected.file_name path = nil Gem.path.find do |gem_dir| path = File.join gem_dir, 'cache', filename File.exist? path end path end