だめねこ飼育日誌 By suteneko
リネ2関連で検索して来たかたはこっちのwikiのほうがいいかも // プロフィール


2016-03-08 (Tue)

AWSでrubygemsを動かす

tDiaryのCGI (要するにココ) を、旧サーバから新サーバ(AWS)にコピーしたら、動きませんでした。

cannot load such file -- json (LoadError)

こんなエラー。おかしいな…、と。だってJSONは、Ruby1.9以降で標準装備なはずなんです。

エラーが出ている行を探してみると

require 'json'

この行です。いたって普通のことをやってそう。



tDiaryのドキュメントにしたがって、bundle installしなおしても同じエラー。

ところが

$ ruby -e "require 'json'"

エラーなしです。

$ gem list | grep json
json (1.8.2)

存在します。

なのにエラー… (´・ω・`)



はてさて、困りました。



こういうときは…



1日寝て別のことをやって過ごす!



..zZ .zZ .zZ .zZ .zZ





↓rubygem (ルビーの宝石)

……

はっ、こ、これは……だって日曜ですもんね! おもちゃ買ってね!





さて、1回ディレクトリを全部消して、やりなおしてみても、同じ結果でした。

何が悪かったんでしょう。gem とか bundler とか調べてたら、こんなのに当たりました。

$ cat .bundle/config
---
BUNDLE_PATH: ".bundle"
BUNDLE_WITHOUT: development:test
BUNDLE_DISABLE_SHARED_GEMS: '1'

システムにインストールされてるgemは無視する設定です。

……

Amazon Linuxのほうでは

$ yum list installed | grep ruby | grep json
rubygem22-json.x86_64 1.8.2-1.39.amzn1 @amzn-main

というわけで、こいつgemです。

……


ファイルの実体のほうを調べてみたところ /usr/share/ruby/gems/2.2/gems/json-1.8.2/lib/json.rb にファイルは存在しました。

でもこれって、BUNDLE_DISABLE_SHARED_GEMS の設定があるから、読まれないんですよね。だから require 'json' でエラー…


というわけで、原因がわかったので対処します。

ここの tDiary だけなら Gemfile いじれば対処できる気はしますが、他に同様にrubyを使っているところで同様の対処は面倒くさい、そもそもAmazon Linuxでgccは標準で入っていない(yum install必要)、等の理由により、システム側に対策を入れてしまうことに。

$ cd /usr/share/ruby/2.2
$ sudo ln -s /usr/share/ruby/gems/2.2/gems/json-1.8.2/lib/json.rb .

これで tDiary 動きました。めでたしめでたし。

本日のツッコミ