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