Ruby、Railsのオフラインインストール

例によってオフラインのWindows8 64bitでRubyをインストールするよ。

Rubyの導入

公式からRubyInstallerをDLしてくる。 インストールするのは記事作成時の最新版2.6.0を想定。

Note

RubyInstaller実行後、MSYS2をインストールするか確認が出る。 MSYS2のインストールを実行するとネットに.dbを取りに行く。

オフラインの場合は別途MSYS2のインストーラをDLしてくる必要がある。

Rubyのインストールに成功していれば、以下のコマンドでバージョンの確認ができる。

Offline Machine
$ ruby --version
ruby 2.6.0p0 (2018-12-25 revision 66547) [x64-mingw32]

gemファイルをオンラインでインストール

以下のGemfileを作成。 bundle package で依存パッケージをすべて.gemファイルとしてDLしてくる。

Online Machine
$ touch Gemfile
$ echo "source 'http://rubygems.org'" >> Gemfile
$ echo "gem 'rails', '5.2.2'" >> Gemfile

$ bundle package
$ ls vendor/cache

オフライン環境で以下のコマンドを実行。自動的に依存パッケージ全てインストールされる。 bundleでなくてgemなので注意。

Offline Machine
$ gem install --local rails-5.2.2.gem

Railsの導入

上まで実行していれば、既にrailsコマンドが使える。 Railsのインストーラもあるようだが、折角なのでgemで続ける。

Offline Machine
$ gem list | grep rails
rails (5.2.2)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.0.4)
sprockets-rails (3.2.1)

$ rails -v
Rails 5.2.2

$ rails new [project name]

rails new 実行時にプロジェクトディレクトリにあるGemfileのパッケージをインストールする為、 run bundle install が実行される。 しかし、オフラインなのでインストールはされないはず。

サーバを起動

先程のgemをインストールできなかったエラーの影響がここに出てくる。

Offline Machine
$ cd [project path]
$ bin/rails s
[ruby path]/lib/ruby/2.6.0/bundler/resolver.rb:287:in `block in verify_gemfile_dependencies_are_found!': Could not find gem 'sqlite3 x64-mingw32' in any of the gem sources listed in your Gemfile. (Bundler::GemNotFound)
# 以下略

今度は [project path]/Gemfile をオンラインに持っていき、先程と同様に.gemファイルをDLしてくる。

DLしてきた.gemファイルは [project path]/vendor/cache に配置。

Bundlerのバージョンエラー

再度サーバ起動を実行。

Offline Machine
$ bin/rails s
[ruby path]/lib/ruby/2.6.0/bundler/lockfile_parser.rb:108:in `warn_for_outdated_bundler_version': You must use Bundler 2 or greater with this lockfile. (Bundler::LockfileError)

Bundlerのバージョンは2.0.1。 Gemfile.lockのBundlerのバージョンが問題だったのか詳しく調べていないが、Gemfile.lockをリネームしたらバージョンが下がっていた。

Offline Machine
$ bundle --version
Bundler version 2.0.1

$ mv Gemfile.lock Gemfile.lock.bk

$ bin/rails s
$ diff Gemfile.lock Gemfile.lock.bk
211c211
<    1.17.2
---
>    2.0.1

SQLite3のエラー

別のエラー発生。

Offline Machine
$ bin/rails s
[ruby path]/lib/ruby/gems/2.6.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require': cannot load such file -- sqlite3/sqlite3_native (LoadError)
from [ruby path]/lib/ruby/gems/2.6.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:291:in `block in require'
from [ruby path]/lib/ruby/gems/2.6.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:257:in `load_dependency'
# 以下略

エラーが起きている大元はsqlite3.rb。 sqlite3/2.6/sqlite3_native がないので、 sqlite3/sqlite3_native を探しに行くが、更にないのでLoadErrorが出る。

[ruby path]/lib/ruby/gems/2.6.0/gems/sqlite3-1.3.13-x64-mingw32/lib/sqlite3.rb
begin
   RUBY_VERSION =~ /(\d+\.\d+)/
   require "sqlite3/#{$1}/sqlite3_native"
rescue LoadError
   require 'sqlite3/sqlite3_native'
end

2.4ディレクトリなんかをリネームして解決するものでもないので、Windows用にdllをDLしてくる必要がある。

SQLiteの公式 のPrecompiled Binaries for Windowsから64-bit DLL (x64)をDL。 適当な場所に展開して、Rubyのインストールディレクトリのbinに配置。

Offline Machine
$ mv sqlite3.dll [ruby path]/bin/
$ mv sqlite3.def [ruby path]/bin/

$ ls [ruby path]/bin/ | grep sqlite3
sqlite3.def
sqlite3.dll*

オンラインの場合、インストールコマンドを叩けば完了。

Online Machine
$ gem uninstall sqlite3 --all
$ gem install sqlite3 --platform ruby -- --with-opt-include=[ruby path]/bin --with-sqlite3-dir=[ruby path]/bin --with-sqlite3-lib=[ruby path]/bin
$ bin/rails s
=> Booting Puma
=> Rails 5.2.2 application starting in development
=> Run `rails server -h` for more startup options

Note

gem install コマンドの末尾に ` – –with-opt-include=[ruby path]/bin –with-sqlite3-dir=[ruby path]/bin –with-sqlite3-lib=[ruby path]/bin` をつける方が確実かもしれないが、 Rubyのインストールディレクトリ内ならなくても大丈夫そう?

オフラインの場合、上述の bundle package だとプラットフォームがどうのとエラーが出て.gemをDLできない。 なので、オンラインでrubygems.orgから.gemファイルをDLしてくる。

Online Machine
$ curl https://rubygems.org/gems/sqlite3/sqlite3-1.3.13.gem --output sqlite3-1.3.13.gem

オフラインでgem installを実行すると、Msysにsqlite3.hがないからエラーが出てしまう。

Offline Machine
$ gem install --local sqlite3-1.3.13.gem --platform ruby
ERROR:  Error installing sqlite3-1.3.13.gem:
ERROR: Failed to build gem native extension.
# 中略
checking for sqlite3.h... no
sqlite3.h is missing. Install SQLite3 from http://www.sqlite.org/ first.

SQLite3の公式からソースをDLしてきてビルドするのが多分定石。 今回は面倒だったので、オンラインから以下の必要なファイルを持ってきてオフラインのRubyに配置した。

Offline Machine
$ cp sqlite3.h [ruby path]/msys64/mingw64/include/
$ cp sqlite3ext.h [ruby path]/msys64/mingw64/include/
$ cp libsqlite3-0.dll [ruby path]/msys64/mingw64/bin/
$ cp sqlite3.exe [ruby path]/msys64/mingw64/bin/
$ cp sqlite3.pc [ruby path]/msys64/mingw64/include/
$ cp slibsqlite3.a [ruby path]/msys64/mingw64/include/
$ cp slibsqlite3.dll.a [ruby path]/msys64/mingw64/include/

$ gem install --local sqlite3-1.3.13.gem --platform ruby
This could take a while...
Successfully installed sqlite3-1.3.13
Parsing documentation for sqlite3-1.3.13
Installing ri documentation for sqlite3-1.3.13
Done installing documentation for sqlite3 after 0 seconds
1 gem installed

$ gem info sqlite3
sqlite3 (1.3.13)

サーバを起動すると http://localhost:3000/ でRailsにアクセスできるようになっているはず。

Offline Machine
$ cd [rails project path]
$ bin/rails s
=> Booting Puma
=> Rails 5.2.2 application starting in development
=> Run `rails server -h` for more startup options