Нужны ли нам require и Gemfile одновременно?

#ruby

#ruby

Вопрос:

В программе ruby есть отдельный файл Gem, который содержит следующие определения:

 
source "https://rubygems.org" 
gem "typhoeus" 
gem "json" 
gem "pg" 
gem "google_drive" , "2.1.11" 
gem "mandrill-api"
  

Если мне по какой-то причине не нужен этот gem-файл, то в ruby script мне нужно добавить require для всех библиотек,
например:

  
require typhoeus
require json
require pg
require google_drive, 2.1.11
require mandrill-api 
  

сработает ли это?

Ответ №1:

Назначение Gemfile может быть полезным, чтобы вы могли гарантировать, что ваш код будет работать, используя bundler, который позволяет вам запускать bundle install , который установит драгоценные камни для работы с текущей версией ruby, которую вы будете использовать для своего кода. Он также добавит Gemfile.lock файл, который неплохо зафиксировать в вашем управлении версиями, чтобы убедиться, что у вас есть рабочий стек, в котором gems и версия ruby совместимы.

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

Обновить

Согласно комментарию @engineersmnky , вы можете указать версию gem, однако, с этим синтаксисом, и он должен работать до тех пор, пока эти драгоценные камни установлены. Сначала вам нужно убедиться, что вы установили версию в свой терминал:

 gem install google_drive -v 2.1.11
  

Тогда вы можете сделать это в своем файле ruby

 require 'rubygems' 
gem 'google_drive', '2.1.11'; 
require 'google_drive' 
require 'typhoeus'
require 'json'
require 'pg' 
require 'mandrill-api' 
  

Комментарии:

1.Однако вы можете использовать rubygems и gem метод без Gemfile для указания заданной версии, например, require 'rubygems'; gem 'google_drive', '2.1.11'; require 'google_drive' в этом случае версия будет поддерживаться благодаря исправлениям, внесенным в Kernel rubygems исходный код

2. @engineersmnky попробовал это в irb и получил Gem::MissingSpecVersionError: Gem::MissingSpecVersionError

3. У вас действительно установлен этот gem? Вам все равно нужно gem install xxx точно так же, как вам нужно было бы сделать для require естественным образом. Я хотел сказать, что вы можете указать версию с помощью rubygems

4. @engineersmnky да, я установил gem перед запуском вашего кода в консоли.

5. @engineersmnky да, это работает, когда я указываю версию с gem install google_drive -v 2.1.11 спасибо, я обновил ответ.