модуль Bundler::Plugin::API::Source
Этот класс предоставляет базу для создания плагинов источников. Все методы здесь необходимы для создания плагина источника (за исключением `uri_hash`, `gem_install_dir`; они являются вспомогательными).
По умолчанию для методов, где это возможно, предоставляются значения, которые, как ожидается, будут работать. Однако все плагины источников должны переопределять `fetch_gemspec_files` и `install`. Значения по умолчанию также не предоставляются для `remote!`, `cache!` и `unlock!`.
Значения по умолчанию должны работать в большинстве случаев, но тем не менее их можно (желательно следует) безопасно переопределять в соответствии с потребностями плагинов (при условии, что они ведут себя так, как ожидается). При переопределении `initialize` вы должны сначала вызвать `super`.
При необходимости плагин должен переопределять методы `hash`, `==` и `eql?`, чтобы иметь возможность сопоставлять объекты, представляющие одни и те же источники, но созданные в разных ситуациях (например, из файла gemfile и lockfile). Значения по умолчанию проверяют только класс и uri, но более сложные плагины источников могут потребовать более подробных сравнений (например, сравнение git по ветке или тегу).
@!attribute [r] uri
@return [String] the remote specified with `source` block in Gemfile
@!attribute [r] options
@return [String] options passed during initialization (either from lockfile or Gemfile)
@!attribute [r] name
@return [String] name that can be used to uniquely identify a source
@!attribute [rw] dependency_names
@return [Array<String>] Names of dependencies that the source should try to resolve. It is not necessary to use this list intenally. This is present to be compatible with `Definition` and is used by rubygems source.
Атрибуты
Публичные методы класса
# File lib/bundler/plugin/api/source.rb, line 47
def initialize(opts)
@options = opts
@dependency_names = []
@uri = opts["uri"]
@type = opts["type"]
@name = opts["name"] || "#{@type} at #{@uri}"
end Методы публичного экземпляра
# File lib/bundler/plugin/api/source.rb, line 207 def ==(other) other.is_a?(self.class) && uri == other.uri end
Это проверяет, представляют ли два объекта источника один и тот же источник.
Сравнение производится только по атрибутам, которые можно определить по параметрам, переданным из Gemfile, а не по атрибутам, используемым для привязки драгоценности к определённой версии (например, источники Git должны сравнивать ветки и теги, но не хеши коммитов).
Объекты источников создаются как из Gemfile, так и из lockfile. Для слияния источников необходимо, чтобы они совпадали.
То же самое относится к `eql?` и `hash`
# File lib/bundler/plugin/api/source.rb, line 172
def app_cache_dirname
base_name = File.basename(URI.parse(uri).normalize.path)
"#{base_name}-#{uri_hash}"
end Имя каталога, в котором плагин ожидается кэшировать драгоценности, когда вызывается cache.
Также это имя сопоставляется с каталогами в кэше для обрезки
Это используется в `app_cache_path`
# File lib/bundler/plugin/api/source.rb, line 231 def app_cache_path(custom_path = nil) @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname) end
Полный путь, где плагин должен кэшировать драгоценность, чтобы её можно было установить позже.
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 293 def bundler_plugin_api_source? true end
@private Возвращает true
# File lib/bundler/plugin/api/source.rb, line 188
def cache(spec, custom_path = nil)
new_cache_path = app_cache_path(custom_path)
FileUtils.rm_rf(new_cache_path)
FileUtils.cp_r(install_path, new_cache_path)
FileUtils.touch(app_cache_path.join(".bundlecache"))
end Этот метод вызывается во время кэширования, чтобы сохранить копию драгоценностей, к которым источник может разрешить путь, предоставленный `app_cache_app`, чтобы их можно было переустановить из кэша без запроса удалённого сервера (т.е. альтернатива удалённому).
Это хранится вместе с приложением, и плагины источника должны пытаться предоставить спецификации и установить только из этого кэша, когда вызывается `cached!`.
Этот кэш отличается от внутреннего кэширования, которое может выполняться в подпутях `cache_path` (из API). Это можно рассматривать как кэширование, выполняемое Bundler.
# File lib/bundler/plugin/api/source.rb, line 156 def cached! end
Set внутреннее представление для извлечения драгоценностей/спецификаций из кэша приложения.
Когда это вызывается, источник должен попытаться извлечь спецификации и установить их из пути, предоставленного `app_cache_path`.
# File lib/bundler/plugin/api/source.rb, line 243 def can_lock?(spec) spec.source == self end
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 302 def double_check_for(*); end
@private Этот API для источника может быть нестабильным, и пока ожидается, что плагины загрузят все спецификации в `#specs`, поэтому мы реализуем метод для обеспечения совместимости и оставим его недокументированным (и не поддерживаем) его перезапись.
При переопределении `eql?`, пожалуйста, сохраните поведение, как указано в документации для метода `==`.
# File lib/bundler/plugin/api/source.rb, line 63 def fetch_gemspec_files [] end
Это используется в методе `spec` по умолчанию для создания объектов спецификаций для драгоценностей и версий, которые могут быть установлены этим плагином источника.
Примечание: Если метод `spec` переопределён, эта функция не нужна.
@return [Array<String>] пути файлов gemspec для драгоценностей, которые могут
be installed
# File lib/bundler/plugin/api/source.rb, line 278 def gem_install_dir Bundler.install_path end
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 218 def hash [self.class, uri].hash end
При переопределении `hash`, пожалуйста, сохраните поведение, как указано в документации для метода `==`, т.е. два метода, равные по вышеприведённому сравнению, должны иметь одинаковый хеш.
# File lib/bundler/plugin/api/source.rb, line 269 def include?(other) other == self end
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 83 def install(spec, opts) raise MalformattedPlugin, "Source plugins need to override the install method." end
Устанавливает драгоценность, указанную спецификацией, в соответствующем пути. `install_path` предоставляет достаточный стандартный путь, если источник может удовлетворить только одну драгоценность, но не является обязательным.
@return [String] сообщение об установке (если есть)
# File lib/bundler/plugin/api/source.rb, line 108
def install_path
@install_path ||=
begin
base_name = File.basename(URI.parse(uri).normalize.path)
gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
end
end Стандартный путь установки для установки одной драгоценности. Если источник обслуживает несколько драгоценностей, это не так полезно, и источник должен использовать свой собственный.
# File lib/bundler/plugin/api/source.rb, line 223 def installed? File.directory?(install_path) end
Вспомогательный метод, не обязательный, если не используется внутри.
# File lib/bundler/plugin/api/source.rb, line 74
def options_to_lock
{}
end Параметры, которые нужно сохранить в lockfile, чтобы плагин источника смог позже проверить ту же версию драгоценности.
Эти параметры передаются при создании плагина источника из lockfile.
@return [Hash]
# File lib/bundler/plugin/api/source.rb, line 99
def post_install(spec, disable_exts = false)
opts = { :env_shebang => false, :disable_extensions => disable_exts }
installer = Bundler::Source::Path::Installer.new(spec, opts)
installer.post_install
end Компилирует расширения, генерирует бинарные файлы и устанавливает их для предоставленной спецификации.
Зависит от `spec.loaded_from`, чтобы получить `full_gem_path`. Плагины источника должны устанавливать это значение.
Должен вызываться в `install` после того, как плагин разместит драгоценность в правильном месте установки.
Также выполняет Gem-хуки `pre_install`, `post_build` и `post_install`
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 149 def remote! end
Set внутреннее представление для извлечения драгоценностей/спецификаций с удалённого сервера.
Когда это вызывается, источник должен попытаться извлечь спецификации и установить их с удалённого сервера.
# File lib/bundler/plugin/api/source.rb, line 287 def root Bundler.root end
Используется для получения `full_gem_path`.
Путь `loaded_from` спецификации расширяется относительно этого, чтобы получить `full_gem_path`.
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 129
def specs
files = fetch_gemspec_files
Bundler::Index.build do |index|
files.each do |file|
next unless spec = Bundler.load_gemspec(file)
Bundler.rubygems.set_installed_by_version(spec)
spec.source = self
Bundler.rubygems.validate(spec)
index << spec
end
end
end Парсит файлы gemspec, чтобы найти спецификации для драгоценных камней, которые могут быть удовлетворены исходным кодом.
Несколько важных моментов, которые следует учитывать:
- If the gems are not installed then it shall return specs for all the gems it can satisfy - If gem is installed (that is to be detected by the plugin itself) then it shall return at least the specs that are installed. - The `loaded_from` for each of the specs shall be correct (it is used to find the load path)
@return [Bundler::Index] индекс, содержащий спецификации
# File lib/bundler/plugin/api/source.rb, line 254
def to_lock
out = String.new("#{LockfileParser::PLUGIN}\n")
out << " remote: #{@uri}\n"
out << " type: #{@type}\n"
options_to_lock.each do |opt, value|
out << " #{opt}: #{value}\n"
end
out << " specs:\n"
end Генерирует содержимое, которое необходимо ввести в файл блокировки. Сохраняет тип и удалённый ресурс, а также вызывает `options_to_lock`.
Plugin следует использовать `options_to_lock` для сохранения информации в файле блокировки, а не перезаписывать это.
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 264
def to_s
"plugin source for #{options[:type]} with uri #{uri}"
end # File lib/bundler/plugin/api/source.rb, line 163 def unlock! end
Этот метод вызывается для обновления спецификации и установки.
Если плагин источников загружается из файла блокировки или иным образом, он обновит кэш/спецификации (например, git-источники могут создать свежую копию).
# File lib/bundler/plugin/api/source.rb, line 238 def unmet_deps specs.unmet_dependency_names end
Используется по определению.
Примечание: Не перезаписывайте, если вы не знаете, что делаете.
# File lib/bundler/plugin/api/source.rb, line 273 def uri_hash SharedHelpers.digest(:SHA1).hexdigest(uri) end
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.