class Bundler::CompactIndexClient

CompactIndexClient 负责获取和解析紧凑索引。

紧凑索引是一组经过缓存优化的文件,用于获取 gem 信息。 这些文件是:

  • names:所有 gem 名称的列表

  • versions:所有 gem 版本的列表

  • info/:一个 gem 的所有版本列表

客户端使用以下内容实例化:

  • ‘directory`:缓存文件存储的根目录。

  • ‘fetcher`:(可选)一个响应 call(uri_path, headers) 并返回 http 响应的对象。

如果未提供 ‘fetcher`,则客户端将仅从磁盘读取缓存文件。

客户端组织为:

  • ‘Updater`:使用 fetcher 更新磁盘上的缓存文件。

  • ‘Cache`:调用 updater、缓存文件、从磁盘读取并返回它们。

  • ‘Parser`:解析紧凑索引文件数据。

  • ‘CacheFile`:一个并发安全的文件读取器/写入器,用于验证校验和。

该客户端旨在优化内存使用和性能。它会被调用 100 次或 1000 次,解析包含数十万行的文件。它可能会在某些 Ruby 中并发调用,而不会产生全局解释器锁。因此,某些方法可能看起来比必要的更复杂,以节省内存或时间。

常量

DEBUG_MUTEX
GemParser
INFO_DEPS
INFO_NAME

info 返回一个 INFO 数组的数组。 每个 INFO 数组具有以下索引:

INFO_PLATFORM
INFO_REQS
INFO_VERSION
SUPPORTED_DIGESTS

注意:这里使用 MD5 并非因为我们期望服务器返回它,而是因为我们在升级到使用保存到文件的 opaque etag 的紧凑索引客户端期间使用它来生成第一次请求时的 etag。一旦 2.5.0 发布一段时间后,可以删除。

公共类方法

debug() 点击以切换源代码
# File bundler/compact_index_client.rb, line 45
def self.debug
  return unless ENV["DEBUG_COMPACT_INDEX"]
  DEBUG_MUTEX.synchronize { warn("[#{self}] #{yield}") }
end
new(directory, fetcher = nil) 点击以切换源代码
# File bundler/compact_index_client.rb, line 57
def initialize(directory, fetcher = nil)
  @cache = Cache.new(directory, fetcher)
  @parser = Parser.new(@cache)
end

公共实例方法

available?() 点击以切换源代码
# File bundler/compact_index_client.rb, line 87
def available?
  Bundler::CompactIndexClient.debug { "available?" }
  @parser.available?
end
dependencies(names) 点击以切换源代码
# File bundler/compact_index_client.rb, line 72
def dependencies(names)
  Bundler::CompactIndexClient.debug { "dependencies(#{names})" }
  names.map {|name| info(name) }
end
info(name) 点击以切换源代码
# File bundler/compact_index_client.rb, line 77
def info(name)
  Bundler::CompactIndexClient.debug { "info(#{name})" }
  @parser.info(name)
end
latest_version(name) 点击以切换源代码
# File bundler/compact_index_client.rb, line 82
def latest_version(name)
  Bundler::CompactIndexClient.debug { "latest_version(#{name})" }
  @parser.info(name).map {|d| Gem::Version.new(d[INFO_VERSION]) }.max
end
names() 点击以切换源代码
# File bundler/compact_index_client.rb, line 62
def names
  Bundler::CompactIndexClient.debug { "names" }
  @parser.names
end
reset!() 点击以切换源代码
# File bundler/compact_index_client.rb, line 92
def reset!
  Bundler::CompactIndexClient.debug { "reset!" }
  @cache.reset!
end
versions() 点击以切换源代码
# File bundler/compact_index_client.rb, line 67
def versions
  Bundler::CompactIndexClient.debug { "versions" }
  @parser.versions
end