Help us understand the problem. What is going on with this article?

古いRuby環境と古いRailsを動かすのにすこしハマった

古い実行環境を構築する必要が発生した

Xcodeのアップデートや brew upgrade 等を行っていたら、
動いていた Rails アプリが動かなくなったので rbenv で Rubyからインストールし直した時にハマったメモです。
全然動かなくなったので Gemfile.lock も削除(リネーム)してから行いました。

環境

プログラム 動いていたバージョン 動かなくなったバージョン 現在のバージョン
bundler 1.13.2 2.2.3 1.13.2
Ruby 2.3.0 2.3.0 2.3.0
Rails ~> 4.2 ~> 4.2 ~> 4.2
PostgreSQL 11 13 13
Xcode 11.x 12.3 12.3

最初の bundler インストール手順(動かなくなったバージョン)

% rbenv uninstall 2.3.0
% rbenv install 2.3.0
% gem install bundler # ← rubygems を新しくしろとエラーになるので
% gem update --system
% gem install bundler 
% cd MY_PROJECT
% bundle install --path vendor/bundle # ← budler のバージョン違いでエラー

ならば 古いbundler 入れれば問題ないだろうとインストール

% gem install bundler -v 1.13.2

やっぱりバージョン違いでエラーなので gem を見てみる

% gem list "^bundler$"

*** LOCAL GEMS ***

% bundler (default:2.2.3, 1.13.2)

下記リンクなどを参考に色々試したのですが、全然解消せず。。。
(というか bundle が動かなくなりました)
How to change Bundler default version

もう一度 bundler のインストール(バージョンエラーそのものは解消)

% rbenv uninstall 2.3.0
% rbenv install 2.3.0
% gem install bundler -v 1.13.2 # 最初から指定
% cd MY_PROJECT
% bundle install # ← bundle でのエラーは解消

エラーは解消できた。

bundle install 時の native extension 系(pg 等)のエラーが多発

function 名は違うかもしれませんが、結構多発しました。
原因はXcode 12にするとチェックが厳しくなるようです。

~snip~
Call.c:334:5: error: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
~snip~

古いXcodeにすれば大丈夫という記事が多かったですが下記サイトを参考にコマンドを実行すればビルド出来ました。
Postgresql gem install pg 0.18.4 passes, bundle install fails

bundle config build.pg '-- --with-cflags="-Wno-error=implicit-function-declaration"'

同様にpuma,nokogiri,libxml等もエラーになる場合があるようですが下記のように追加すれば動く様です。

bundle config build.puma '-- --with-cflags="-Wno-error=implicit-function-declaration"'

--は必要性がちょっと解りませんでしたが。。。

ビルド出来た pg が PostgreSQL にアクセス時にエラー

(抜粋)
Add `gem 'pg'` to your Gemfile and ensure its version is at the minimum required by ActiveRecord

バージョン指定をしていなかったので pg 1.x が入ってしまっていました。

Gemfile を修正

gem 'pg'
↓
gem 'pg', '0.18.4'

Gemfile.lockがあるとはいえ、Gemfileに書く gem は基本的にバージョン指定しておかないと駄目ですね。。

Masato-I
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away