Подтвердить что ты не робот

Rails 3.1 Двигатели: различие my_engine.gemspec, add_dependency, add_development_dependency и Gemfile

Просто из любопытства... в моем предыдущем сообщении Rails3.1: не может заставить SLIM или HAML работать в тестовом/фиктивном приложении Я спросил, где чтобы сообщить Ruby использовать какой-то камень в моем приложении test/dummy.

Ответ (очевидный?) заключался в том, чтобы просто поместить его в Gemfile моего Engine. Это работает, но мне это немного неудобно, потому что в Yehuda Katz 'Post Разъяснение ролей .gemspec и Gemfile он упоминает, что...

... при разработке драгоценного камня Gemfile "gem Gemfile должен содержать источник Rubygems и одну строку gemspec".

С другой стороны, в моем Gemfile Engine (который был сгенерирован с использованием Rails rails plugin new my_engine):

# jquery-rails is used by the dummy application
gem "jquery-rails"

Итак, это кажется правильным. Обновление: нет, это не так! Посмотрите на мой ответ ниже...

Тем не менее, qaru.site/info/306595/... Я вижу, что решение для этого, как говорят, просто требует необходимый камень в config/application.rb, а https://stackoverflow.com/info/5159607/rails-engine-gems-dependencies-how-to-load-them-in-the-application, которые, по его словам, лучше всего помещаются в lib/<your_engine>/engine.rb file.

И вот моя мысль: почему приложение test/dummy просто автоматически требует всех Gems, указанных в файле .gemspec? Мы даже рассказываем о драгоценных камнях, которые можно использовать для производства, и которые для режима разработки явно используют add_dependency и add_development_dependency, поэтому я не вижу причин, почему test/dummy не делает этого.

Итак, вот последний вопрос: где именно я должен сказать Ruby использовать драгоценный камень в моем приложении test/dummy? Я НЕ ХОЧУ НАПРАВЛЯТЬ РУБИ, ЧТОБЫ ИСПОЛЬЗОВАТЬ GEM ТАКЖЕ В ПРИЛОЖЕНИИ ПРИЛОЖЕНИЯ.

4b9b3361

Ответ 1

Вот что я выяснил до сих пор.

Внутри движка (созданного с помощью rails plugin new my_engine) вам нужно указать необходимые драгоценные камни только в файле my_engine.gemspec, так как они затем ссылаются на файл test/dummy/Gemfile с помощью gemspec.

Здесь созданный файл test/dummy/Gemfile:

source "http://rubygems.org"

# Declare your gem dependencies in simple_view_helpers.gemspec.
# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.
gemspec

# jquery-rails is used by the dummy application
gem "jquery-rails"

# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
# Git. Remember to move these dependencies to your gemspec before releasing
# your gem to rubygems.org.

# To use debugger
# gem 'debugger'

Что делает строка gem "jquery-rails" здесь, я действительно не знаю, кажется, полностью противоречит тому, что предлагается в комментариях. С другой стороны, когда я пытаюсь использовать SLIM gem (вместо ERB) в своем тестовом/фиктивном приложении, кажется Я do должен указать его в Gemfile, иначе это не сработает. Все еще немного запутанно, этот материал...

Ответ 2

Я думаю, что правильный способ продолжения:

Двигатель - обычный камень. Когда вы разрабатываете драгоценный камень, вы помещаете его зависимости в файл gemspec. Если вы используете пакет, вы, как разработчик, можете создать файл .lock с конкретными версиями, в которых у вас не было проблем. Но для этих зависимостей, объявленных в gemspec, недостаточно, чтобы использовать их, вы должны require их в своем коде gem. Когда они необходимы, если камень используется с пакетом, используются версии .lock.

В двигателе, как и любой другой камень, он тот же. Вы определяете свои зависимости в вашем файле gemspec, и вы запускаете bundle install, но недостаточно использовать их. Вы должны потребовать их, например, в lib/my_engine.rb.

Например:

# File: my_engine.rspec
# ...
s.add_dependency `slim_rails`, ' ~>1.0'

#...

# File: lib/my_engine.rb
require "my_engine/engine"
require "slim-rails"

module MyEngine
end

Я не уверен, почему они используются без лишних проблем, если они установлены в Gemfile, но как рельсовая документация говорит:

Зависимости Gem внутри двигателя должны быть указаны внутри .gemspec в корневом каталоге движка. Причина в том, что двигатель может быть установлен как драгоценный камень. Если зависимости должны были быть указаны внутри Gemfile, они не будут распознаны традиционной драгоценной камней и поэтому они не будут установлены, что приведет к неисправность.

Ответ 3

TL; ДР:

Не используйте Gemfile при разработке движка. Поместите все в свой движок gemspec, и пусть сам двигатель требует всего, что ему нужно.


Почему приложение test/dummy просто автоматически требует всех Gems, указанных в файле .gemspec?

Я думаю, что приложения не требуют автоматического зависания своих двигателей по причинам производительности.

Итак, если фиктивное приложение должно быть подлинным симулятором реального приложения с использованием движка, оно также не должно этого делать.

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

как говорят, просто требуется необходимый камень в config/application.rb

Это также может маскировать зависимости от времени выполнения вашего движка, поэтому лучше не делать этого.

Итак, вот последний вопрос: где именно я должен сказать Ruby использовать драгоценный камень в моем тестовом/фиктивном приложении? Я не хочу заставить рубин использовать камень и в главном приложении.

Если этот камень нужен только для тестов, попросите его в вашем помощнике test/spec.

Иначе, если этот жемчуг необходим для запуска вашего движка, вы действительно должны обеспечить его использование.

Джеймс: Это заставило бы меня поверить, что зависимостей в двигателе идут в gemspec, в то время как фиктивные зависимости приложений помещаются в Gemfile

Фиктивный пул приложений-апплетов фактически ссылается на собственное фиктивное приложение, которое отсутствует в Gemfile. Поэтому я предполагаю, что это запрещено. И это имеет смысл.

Подумайте об этом так: все, что вы делаете, чтобы изменить фиктивное приложение, приведет к тому, что тесты не будут выполняться на нейтральном фоне и, следовательно, не будут репрезентативными.

Если вы действительно хотите, чтобы иметь возможность повторно использовать свой движок, и чтобы его можно было добавить в любое новое новое приложение Rails, ваше фиктивное приложение должно быть именно таким: пустым, новым Rails-приложением.