class Gem::Package
Beispiel zur Verwendung einer Gem::Package
Erstellt eine .gem-Datei anhand einer Gem::Specification. Eine .gem-Datei ist ein Tarball, der data.tar.gz, metadata.gz, checksums.yaml.gz und möglicherweise Signaturen enthält.
require 'rubygems' require 'rubygems/package' spec = Gem::Specification.new do |s| s.summary = "Ruby based make-like utility." s.name = 'rake' s.version = PKG_VERSION s.requirements << 'none' s.files = PKG_FILES s.description = <<-EOF Rake is a Make-like program implemented in Ruby. Tasks and dependencies are specified in standard Ruby syntax. EOF end Gem::Package.build spec
Liest eine .gem-Datei.
require 'rubygems' require 'rubygems/package' the_gem = Gem::Package.new(path_to_dot_gem) the_gem.contents # get the files in the gem the_gem.extract_files destination_directory # extract the gem into a directory the_gem.spec # get the spec out of the gem the_gem.verify # check the gem is OK (contains valid gem specification, contains a not corrupt contents archive)
files sind die Dateien in der .gem-Tar-Datei, nicht die Ruby-Dateien im Gem extract_files und contents rufen automatisch verify auf
Attribute
Prüfsummen für den Inhalt des Pakets
Berechtigung für andere Dateien
Berechtigung für Verzeichnisse
Die Dateien in diesem Paket. Dies ist nicht der Inhalt des Gems, sondern nur die Dateien im übergeordneten Container.
Verweis auf das verpackte Gem.
Berechtigung für Programmdateien
Die Sicherheitsrichtlinie, die zur Überprüfung des Inhalts dieses Pakets verwendet wird.
Legt die Gem::Specification fest, die zum Erstellen dieses Pakets verwendet werden soll.
Öffentliche Klassenmethoden
Source
# File lib/rubygems/package.rb, line 132 def self.build(spec, skip_validation = false, strict_validation = false, file_name = nil) gem_file = file_name || spec.file_name package = new gem_file package.spec = spec package.build skip_validation, strict_validation gem_file end
Source
# File lib/rubygems/package.rb, line 149 def self.new(gem, security_policy = nil) gem = if gem.is_a?(Gem::Package::Source) gem elsif gem.respond_to? :read Gem::Package::IOSource.new gem else Gem::Package::FileSource.new gem end return super unless self == Gem::Package return super unless gem.present? return super unless gem.start return super unless gem.start.include? "MD5SUM =" Gem::Package::Old.new gem end
Erstellt ein neues Gem::Package für die Datei unter gem. gem kann auch als IO-Objekt übergeben werden.
Wenn gem eine vorhandene Datei im alten Format ist, wird ein Gem::Package::Old zurückgegeben.
BasicObject::new aufSource
# File lib/rubygems/package.rb, line 172 def self.raw_spec(path, security_policy = nil) format = new(path, security_policy) spec = format.spec metadata = nil File.open path, Gem.binary_mode do |io| tar = Gem::Package::TarReader.new io tar.each_entry do |entry| case entry.full_name when "metadata" then metadata = entry.read when "metadata.gz" then metadata = Gem::Util.gunzip entry.read end end end [spec, metadata] end
Extrahiert die Gem::Specification und Metadaten im Rohformat aus der .gem-Datei unter path.
Öffentliche Instanzmethoden
Source
# File lib/rubygems/package.rb, line 222 def add_checksums(tar) Gem.load_yaml checksums_by_algorithm = Hash.new {|h, algorithm| h[algorithm] = {} } @checksums.each do |name, digests| digests.each do |algorithm, digest| checksums_by_algorithm[algorithm][name] = digest.hexdigest end end tar.add_file_signed "checksums.yaml.gz", 0o444, @signer do |io| gzip_to io do |gz_io| Psych.dump checksums_by_algorithm, gz_io end end end
Fügt jeder Eintrag im Gem eine Prüfsumme zu checksums.yaml.gz hinzu.
Source
# File lib/rubygems/package.rb, line 293 def build(skip_validation = false, strict_validation = false) raise ArgumentError, "skip_validation = true and strict_validation = true are incompatible" if skip_validation && strict_validation Gem.load_yaml @spec.validate true, strict_validation unless skip_validation setup_signer( signer_options: { expiration_length_days: Gem.configuration.cert_expiration_length_days, } ) @gem.with_write_io do |gem_io| Gem::Package::TarWriter.new gem_io do |gem| add_metadata gem add_contents gem add_checksums gem end end say <<-EOM Successfully built RubyGem Name: #{@spec.name} Version: #{@spec.version} File: #{File.basename @gem.path} EOM ensure @signer = nil end
Erstellt dieses Paket basierend auf der Spezifikation, die durch spec= festgelegt wurde.
Source
# File lib/rubygems/package.rb, line 327 def contents return @contents if @contents verify unless @spec @contents = [] @gem.with_read_io do |io| gem_tar = Gem::Package::TarReader.new io gem_tar.each do |entry| next unless entry.full_name == "data.tar.gz" open_tar_gz entry do |pkg_tar| pkg_tar.each do |contents_entry| @contents << contents_entry.full_name end end return @contents end end rescue Zlib::GzipFile::Error, EOFError, Gem::Package::TarInvalidError => e raise Gem::Package::FormatError.new e.message, @gem end
Eine Liste von Dateinamen, die in diesem Gem enthalten sind.
Source
# File lib/rubygems/package.rb, line 215 def copy_to(path) FileUtils.cp @gem.path, path unless File.exist? path end
Kopiert dieses Paket nach path (falls möglich).
Source
# File lib/rubygems/package.rb, line 386 def extract_files(destination_dir, pattern = "*") verify unless @spec FileUtils.mkdir_p destination_dir, mode: dir_mode && 0o755 @gem.with_read_io do |io| reader = Gem::Package::TarReader.new io reader.each do |entry| next unless entry.full_name == "data.tar.gz" extract_tar_gz entry, destination_dir, pattern break # ignore further entries end end rescue Zlib::GzipFile::Error, EOFError, Gem::Package::TarInvalidError => e raise Gem::Package::FormatError.new e.message, @gem end
Extrahiert die Dateien in diesem Paket nach destination_dir.
Wenn pattern angegeben ist, werden nur übereinstimmende Einträge extrahiert.
Source
# File lib/rubygems/package.rb, line 495 def gzip_to(io) # :yields: gz_io gz_io = Zlib::GzipWriter.new io, Zlib::BEST_COMPRESSION gz_io.mtime = @build_time yield gz_io ensure gz_io.close end
Komprimiert den in gz_io geschriebenen Inhalt nach io.
Source
# File lib/rubygems/package.rb, line 561 def read_checksums(gem) Gem.load_yaml @checksums = gem.seek "checksums.yaml.gz" do |entry| Zlib::GzipReader.wrap entry do |gz_io| Gem::SafeYAML.safe_load limit_read(gz_io, "checksums.yaml.gz", 10 * 1024 * 1024) end end end
Liest und lädt checksums.yaml.gz aus der Tar-Datei gem.
Source
# File lib/rubygems/package.rb, line 575 def setup_signer(signer_options: {}) passphrase = ENV["GEM_PRIVATE_KEY_PASSPHRASE"] if @spec.signing_key @signer = Gem::Security::Signer.new( @spec.signing_key, @spec.cert_chain, passphrase, signer_options ) @spec.signing_key = nil @spec.cert_chain = @signer.cert_chain.map(&:to_s) else @signer = Gem::Security::Signer.new nil, nil, passphrase @spec.cert_chain = @signer.cert_chain.map(&:to_pem) if @signer.cert_chain end end
Bereitet das Gem für die Signierung und die Generierung von Prüfsummen vor. Wenn kein Signaturzertifikat und kein Schlüssel vorhanden sind, wird nur die Prüfsummengenerierung eingerichtet.
Source
# File lib/rubygems/package.rb, line 602 def spec verify unless @spec @spec end
Die Spezifikation für dieses Gem.
Wenn es sich um ein Paket für ein erstelltes Gem handelt, wird die Spezifikation aus dem Gem geladen und zurückgegeben. Wenn es sich um ein Paket für ein gerade erstelltes Gem handelt, wird die übergebene Spezifikation zurückgegeben.
Source
# File lib/rubygems/package.rb, line 618 def verify @files = [] @spec = nil @gem.with_read_io do |io| Gem::Package::TarReader.new io do |reader| read_checksums reader verify_files reader end end verify_checksums @digests, @checksums @security_policy&.verify_signatures @spec, @digests, @signatures true rescue Gem::Security::Exception @spec = nil @files = [] raise rescue Errno::ENOENT => e raise Gem::Package::FormatError.new e.message rescue Zlib::GzipFile::Error, EOFError, Gem::Package::TarInvalidError => e raise Gem::Package::FormatError.new e.message, @gem end
Überprüft, ob dieses Gem
-
Eine gültige Gem-Spezifikation enthält
-
Ein Inhaltsarchiv enthält
-
Das Inhaltsarchiv ist nicht beschädigt
Nach der Überprüfung ist die Gem-Spezifikation aus dem Gem über spec verfügbar.
Geschützte Instanzmethoden
Source
# File lib/rubygems/package.rb, line 196 def initialize(gem, security_policy) # :notnew: require "zlib" @gem = gem @build_time = Gem.source_date_epoch @checksums = {} @contents = nil @digests = Hash.new {|h, algorithm| h[algorithm] = {} } @files = nil @security_policy = security_policy @signatures = {} @signer = nil @spec = nil end
Erstellt ein neues Paket, das von oder nach der Datei gem liest oder schreibt.
Private Instanzmethoden
Source
# File lib/rubygems/package.rb, line 736 def limit_read(io, name, limit) bytes = io.read(limit + 1) raise Gem::Package::FormatError, "#{name} is too big (over #{limit} bytes)" if bytes.size > limit bytes end
Source
# File lib/rubygems/package.rb, line 669 def verify_entry(entry) file_name = entry.full_name @files << file_name case file_name when /\.sig$/ then @signatures[$`] = limit_read(entry, file_name, 1024 * 1024) if @security_policy return else digest entry end case file_name when "metadata", "metadata.gz" then load_spec entry when "data.tar.gz" then verify_gz entry end rescue StandardError warn "Exception while verifying #{@gem.path}" raise end
Überprüft den Eintrag entry in einer .gem-Datei.
Source
# File lib/rubygems/package.rb, line 695 def verify_files(gem) gem.each do |entry| verify_entry entry end unless @spec raise Gem::Package::FormatError.new "package metadata is missing", @gem end unless @files.include? "data.tar.gz" raise Gem::Package::FormatError.new \ "package content (data.tar.gz) is missing", @gem end if (duplicates = @files.group_by {|f| f }.select {|_k,v| v.size > 1 }.map(&:first)) && duplicates.any? raise Gem::Security::Exception, "duplicate files in the package: (#{duplicates.map(&:inspect).join(", ")})" end end
Überprüft die Dateien des gem.