10日目 遠回りしながらRailsインストール[JRuby 9.1.17]③
おはようございます。
昨日の続きをまた書いていきます。
昨日の記事はこちらで、JRuby on Railsでアプリの雛形のみ作って、herokuへデプロイしようとしているところです。
昨日までで計3回Railsのインストールに失敗しましたが、今日もまた挑戦します。
前回までのおさらい
まず、herokuへデプロイするための前提条件として、
1. JDK 8インストール
2. JRuby 9.1.17インストール
3. bundlerのインストール
というのがあったので、その通りまずは自分のPCに上記の1と2をインストールしていました。
そして、そのRailsをインストールしようとしたところ、なかなかうまくいかないため、herokuでjrubyが動くサンプルとして公開しているアプリ(Github上)のGemfile(bundlerを用いてアプリの動作に必要なRubyのGemを一括でインストールするためのファイル)を見てみたりしました。
上で公開されているGemfileの内容をそのままコピペして、「bundle install」コマンドでRailsを含めてインストールしようと思いましたが、結局、対象とするRubyのバージョンが違う、とのことで以下のように引っかかって、昨日は、そこで一旦作業を止めました。
次からが本日の作業内容の記録になります。
一旦、体制を整える
エラーメッセージの内容を確認すると、最後の行あたりに、「Your Ruby version is 2.3.3 but your Gemfile specified 2.3.1」という表記があります。
ここでどのように動くかですが、
1. JRubyのバージョンを9.1.17ではなく9.1.8に下げる
(JRubyに対応するRubyのバージョンを2.3.3から2.3.1に下げる)
2. JRubyのバージョンを9.1.17にキープする
という方針があると思います。まあJRubyにこだわる必要はないかもしれませんが、わたし自身はJRubyが好きなので、なるべくJRubyでもデプロイするようにやってみようと思います。(仕事ではなく趣味でやっているので納期があるわけでもありませんし。)
それで、少し考えましたが、2の「JRubyのバージョンを9.1.17にキープする」という方針で、何とかRailsをインストールする方法を試みることにします。JRubyをインストールし直すのも少し手間に感じましたし、herokuの公式ページとしては、「JRuby 9.1.17」が前提条件としてある以上、何かしらRailsをインストールして、それでデプロイする道が必ずあると思うので。
それで、GemfileのRubyで指定していたバージョンについて以下の通り、現在のインストール済のJRubyのバージョンに合わせて、変更することにいたしました。(JRuby 9.1.17 ⇒対応するRubyのバージョン 2.3.3)
変更前
ruby '2.3.1', :engine => 'jruby', :engine_version => '9.1.8.0'
変更後
ruby '2.3.3', :engine => 'jruby', :engine_version => '9.1.17.0'
予想外のインストールエラー出現。
Gemfileで指定するJRubyのバージョンを9.1.17に合わせ直したところで、一度、その状態で以下のコマンドを入力して、Railsのインストールを試みてみました。(念のため、現在のGemfileの内容は以下の通りです。)
source 'https://rubygems.org'
ruby '2.3.3', :engine => 'jruby', :engine_version => '9.1.17.0'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.4'
# Use postgresql as the database for Active Record
gem 'activerecord-jdbcpostgresql-adapter'
gem 'rails_12factor', group: :production
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.3'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring', group: :development
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
gem 'tzinfo-data', platforms: [:mingw, :mswin, :jruby]
gem 'puma'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
# Use debugger
# gem 'debugger', group: [:development, :test]
そこで、「jruby -S」を頭に付けて、以下のコマンドを打ってインストールを試みました。
jruby -S bundle install
まあ、Railsに関連するどこかのGemのインストール時で何かしらに引っかかってエラーが出るだろうと予想していましたが、
「NameError: uninitialized constant Errno::ENOTSUP
Did you mean? Errno::ENOTEMPTY」
という予想外のエラーが出てきました。はて???(@@)
bundle自体が新しすぎるかもしれない。
いったいどういうことだろうと思って色々と考えながらネット上から調べてみました。
すると、以下のように気になる記事がありました。
上記の記事の中で記載されているエラーは、今回の予想外のエラーとは異なるものですが、上記の記事の中で、以下のように気になる記述がありました。
この記述を見て、
「あれ、そういえば、インストール時にbundlerのバージョン指定していないから、もしかしてbundleのバージョンが最新版になっていて、今のjrubyのバージョンに比べて新しすぎるかもしれない」
という発想に至りました。
そこで、現在インストール可能なbundlerのバージョンを調べてみました。そしたら以下のように参考になりそうな記事を見つけました。
以下のコマンドを打つと、インストール可能なbundlerのバージョンが一覧で表示されるようです。
gem search ^bundler$ --all
一応、今回はjrubyを対象にしているので、先頭に「jruby -S」を付けて、
jruby -S gem search ^bundler$ --all
上記のコマンドをコマンドプロンプトにて打ってみます。
それで、実際にコマンドプロンプトで見てみたら、
上記のように、色々とバージョン番号が出ていて、bundleの数字が最も大きいのは「2.3.15」でした。(2022年6月8日 現在)
それで、私のPCにインストール済であるbundlerのバージョンを以下のコマンドで調べてみました。
jruby -S gem list bundler
そしたら、以下のように、bundlerのバージョンが「2.3.15」となっており、bundlerの(2022年6月8日 現在の)最新版を使っているということがわかりました。
今回の予想外のエラーとどのように関係があるのか?とお考えの方もいると思いますが、先ほどの「jruby -S bundle install」を入力した後のエラーメッセージの詳細をよく確認してみると、
上の図のように、
「read_file at C:\jruby-9.1.17.0\lib\ruby\gems\shared\gems\bundler-2.3.15\lib\bundler.rb:568」
というエラーの一行があり、「jruby 9.1.17」に対して、「bundler 2.3.15」が使われており、そして、インストールエラーが起こったのも、「bundler.rb」にて568行目が読み込まれたことであるからも、「bundler」あたりに問題がありそう、と推測することができます。
それで、「jruby 9.1.17.0」というのは以下のページによれば、2018年4月23日、つまり今から4年前にリリースされているものです。
一方で、「bundler 2.3.15」は以下のページによれば、2022年1月1日にリリースされており、「jruby 9.1.17.0」に比べて、とても新しいということがわかります。
その意味では、以下のエラーが出てきましたが、「bundler 2.3.15」を使って「jruby -S bundle install」にてコマンドを入力してインストールする際に以下のエラーが出たのは、「jruby 9.1.17.0」側が古すぎて、「Errno::ENOTSUP」という定数が定義されていない可能性があると考えることができます。
「NameError: uninitialized constant Errno::ENOTSUP
Did you mean? Errno::ENOTEMPTY」
今回は「JRubyのバージョンを9.1.17にキープする」方針ですので、bundlerのバージョンを下げることにします。bundlerのバージョンの指定方法については先ほども載せましたが、再度以下に参考となる記事を載せます。
おわりに
そろそろ仕事の時間が近づいたので、今日はここまで…。
時間がまだまだかかりそうですが、じっくりいくとします…。
次のターンに続きます。