Что нужно для копирования rubygem из одной установки в другую? - PullRequest
0 голосов
/ 17 июня 2019

Что мне делать, если я хочу скопировать установленный гем из одной установки в другую (без использования команды gem)?

Справочная информация:

Мне нужно установить sqlite3 насервер без подключения к интернету.Обычно я могу сделать это с копией gem-файла:

gem install --local sqlite3-1.4.0.gem --platform ruby

Но для sqlite3 требуется подключение к Интернету, чтобы получить библиотеки для компиляции некоторых двоичных файлов.

Установка сработалахорошо на компе с интернетом.Поэтому я решил взять мою успешную установку (ту же ОС и ту же версию ruby) и скопировать все связанные компоненты.

Но это не сработало.

Проблема в деталях

Когда я вызываю следующую команду

require 'sequel'
db = Sequel.sqlite

, тогда я получаю следующую ошибку:

LoadError: The specified module could not be found
d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3/sqlite3_native.so 
(Sequel::AdapterNotFound)

В деталях:

d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': LoadError: 126: The specified module could not be found.   - d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3/sqlite3_native.so (Sequel::AdapterNotFound)
  from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3.rb:6:in `rescue in <top (required)>'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3.rb:2:in `<top (required)>'
  from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
  from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
  from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/adapters/sqlite.rb:3:in `<top (required)>'
  from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/database/connecting.rb:88:in `load_adapter'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/database/connecting.rb:17:in `adapter_class'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/database/connecting.rb:45:in `connect'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/core.rb:121:in `connect'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/core.rb:399:in `adapter_method'
  from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/core.rb:406:in `block (2 levels) in def_adapter_method'
  from _ruby_version.rb:21:in `<main>'

Но файл существует:

File structure

В чем моя ошибка?

Если это из интереса: я использую Win Server 2016.

Заключительное замечание

Я обнаружил предварительно скомпилированную версию sqlite3 в github выпуске (это работает для меня).Но я бы хотел использовать более новую версию.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Вам необходимо использовать опцию package для упаковщика.

Сначала вам нужно кэшировать свои зависимости в vendor/cache с помощью:

bundle package --all --all-platforms

Это установит все зависимости вашего Gemfile локально, затем добавит каталог в ваш репозиторий исходного кода.

При развертывании убедитесь, что вы используете bundle install --local для использования локальной версии.

Документы в комплекте: здесь

1 голос
/ 17 июня 2019

Используйте Bundler для этого.

Короче говоря:

  • Запустите gem install bundler на каждой машине, которую вы используете.
  • Ведение проекта Gemfile с перечислением всех требований
  • Запустите bundle install при изменении Gemfile и bundle update для обновления до последних версий. Это создаст файл Gemfile.lock.
  • Префикс выполнения Ruby с bundle exec, например, bundle exec ruby myscript или bundle exec rails c

Это краткое резюме, но, пожалуйста, прочтите больше о Bundler. Это неотъемлемая часть современного развертывания Ruby.

...