Bundler: почему он читает gemspec по требованию "bundler / setup"? - PullRequest
2 голосов
/ 27 января 2012

Заголовок - это вопрос, а вот контекст, который его подсказывает.

Gemfile:

source "http://rubygems.org"

# Specify your gem's dependencies in the gemspec
gemspec

Вот верх файла рэка:

require 'rubygems'
require "bundler/setup"

При запуске файла Rackup выдается ошибка:

<module:Rack>': GemName is not a class (TypeError)

Почему? Потому что я пишу кусок промежуточного программного обеспечения Rack, и стандартная компоновка:

lib/
  rack/
    gem_name.rb
    gem_name/
      version.rb

gem_name.rb будет содержать:

module Rack
  class GemName

version.rb будет содержать:

module Rack
  module GemName
    VERSION = "0.0.1"

Наконец, gem_name.gemspec будет содержать:

require "rack/flash-in-the-pan/version"
#...
s.version     = Rack::GemName::VERSION

Наименование модуля и класса с одинаковым именем не является проблемой , если вам не требуются оба файла одновременно. Обычно , это не так Это может произойти, так как вам нужна либо версия для сборки гема, либо вам нужно запустить библиотеку гемов, требуется только одно или другое.

Но на этот раз я решил использовать Bundler для управления зависимостями драгоценного камня. Когда требуется библиотека gem через компоновщик, она, очевидно, тоже запускает gemspec. Я могу легко «исправить» это, я определяю номер версии вручную в gemspec.

Итак, вернемся к моему вопросу - зачем Bundler искать в gemspec время выполнения библиотеки?

связка (1.0.21)

Любое понимание очень ценится.

1 Ответ

3 голосов
/ 07 февраля 2012

Каждый раз, когда вы запускаете компоновщик, он должен анализировать Gemfile, чтобы выяснить, какие гемы нужно загрузить, что добавить в $LOAD_PATH и так далее. Как часть этого, он должен разобрать gemspec.

Gemfile.lock содержит информацию обо всех драгоценных камнях, а также о зависимостях, чтобы сэкономить время запуска, но это не избавляет от необходимости разбирать Gemfile.

Существуют различные способы обойти это. Два простых - использовать File.read и некоторое регулярное выражение для извлечения версии. Или требовать файлы gem_name.rb и gem_name / version.rb.

...