2016-04-20 9 views
0

Я делаю учебное пособие по аутентификации и натолкнулся на следующую строку для gemfile. Каково использование require здесь?Что значит `require:` в Rails gemfile?

gem 'google-api-client', require: 'google/api_client' 

Учебник: http://willschenk.com/setting-up-devise-with-twitter-and-facebook-and-other-omniauth-schemes-without-email-addresses/

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

Я особенно заинтересован, потому что после добавления этой строки и запуска сервера я столкнулся с ошибкой.

Ошибка:

/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.11.2/lib/bundler/runtime.rb:77:in `require': cannot load such file -- google/api_client (LoadError)

Временное решение: Я закомментировал require: часть и предотвращается ошибка. Но, возможно, это не идеально.

Так что понимание использования require очень поможет в устранении этой проблемы.

Я прочитал другие статьи о SO, но они обсуждают особенности, такие как require => nil и require => false, что, я думаю, немного отличается от моего вопроса.

  1. Bunder: What does :require => nil in Gemfile mean?
  2. Bundler: What does :require => false in a Gemfile mean?

Может кто-нибудь поделиться Подстрекают?

UPDATE

позже я нашел это что объясняет это хорошо: When do you need a require in a rails Gemfile?

If you omit the :require option, by default Bundler will attempt to require the gem by using the standard name-to-file conversion rule:

This works well if the gem author has followed the standard conventions. But in some cases, for a variety of reasons, this doesn't happen.

+0

Попробуйте добавить «require ..» в соответствующую модель, в которой вы используете драгоценный камень, и не включайте эту часть в файл gem. –

+0

Обычно эта ошибка означает, что в папке библиотеки google-api-client' gem нет файла 'google/api_client', проверьте его вручную, отправив в bash:' file $ (bundle show google-api-client)/lib/google/api_client' –

+0

Я могу на самом деле cd прямо в каталог 'api_client' -'/usr/local/rvm/gems/ruby-2.3.0/gems/google-api-client-0.9.5/lib/google/api_client' , Может ли это выглядеть не в том месте? –

ответ

1

Когда сам камень не требует какой-либо из его Lib, что вам нужно сделать, что либо в вашей Gemfile (так, как вы написали) или в каком-либо файле в вашем проекте.

Например: представить себе драгоценный камень, который имеет более одного решения для любой конкретной проблемы. Однако вы не хотите загружать все эти решения (файлы), вам нужен только один. Затем вам нужно указать, какой файл вы хотите загрузить, используя require: some_lib.

+0

Это строго сделано по соображениям производительности, и исключение 'require' не будет иметь никаких негативных последствий для функциональности приложения? –

+0

@pandaman не обязательно. В зависимости от того, как структурирован жемчуг, вам нужно добавить 'require'. –