LoadErrorに心が折れそうなときに試したい2つのこと

[gae/jruby] GAE/J+JRuby環境のno such file to loadに心が折れそうなときに試したい2つのこと

今日の課題

このエラーに対処します。

$
$ dev_appserver.rb .
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
中略
org.jruby.rack.RackInitializationException: no such file to load -- appengine-apis/users
	from ./app.rb:2
	from ./app.rb:19:in `require'
	from config.ru:19
  
	at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:172)
	at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:51)
	at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:27)
中略
$
$

このエラーにも対処します。

$ jruby -S spec spec/なんとかかんとか_spec.rb
#<LoadError: no such file to load -- appengine-apis>
中略
/opt/local/share/java/jruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require': no such file to load -- appengine-apis (LoadError)
	from /opt/local/share/java/jruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
中略

誰が使うの?

  • 正しいかどうかはさておき、とにかくコンパイルを通したい人
  • require 'appengine-apis/logger'とかrequire 'appengine-apis/users'が通らなくてイライラしている人

どのように機能するの?

  • appengine-apisへのパスをとにかく通します。

どこで確認したの?

$ uname -v
Darwin Kernel Version 10.3.0: Fri Feb 26 11:58:09 PST 2010; root:xnu-1504.3.12~1/RELEASE_I386
$ 
$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10]
$ 
$ jruby -v
jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2010-04-22 6586) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_17) [x86_64-java]
$ 
$ java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)
$ 

いつ確認したの?

  • 2010年5月4日

何が参考になるの?

  • 特にありません。

何か注意点はあるの?

  • このやり方が正しいかよくわかりません。正しくなくてもとにかく動かしたい人向け。

試したいこと。その1

こういうコードで..

$
$ cat app.rb
require 'sinatra'
require 'appengine-apis/users'

get '/' do
  puts "aa"
end
$
$
$ cat Gemfile 
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem "appengine-rack"
gem 'sinatra'
$ 
$

開発サーバを起動時に no such file to load エラーがでるとき。

$
$ dev_appserver.rb .
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
中略
org.jruby.rack.RackInitializationException: no such file to load -- appengine-apis/users
	from ./app.rb:2
	from ./app.rb:19:in `require'
	from config.ru:19
  
	at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:172)
	at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:51)
	at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:27)
中略
$
$

コード内にrequire 'appengine-apis' を追記して....
Gemfileにgem 'appengine-apis' を追記して....

$
$
$ cat app.rb
require 'sinatra'
require 'appengine-apis'
require 'appengine-apis/users'

get '/' do
  puts "aa"
end
$ 
$
$ cat Gemfile 
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem "appengine-rack"
gem 'appengine-apis'
gem 'sinatra'
$ 
$


実行するとロードエラーが消えた!!
パスに解決にgem 'appengine-apis'が必要だったようです。

$
$
$ dev_appserver.rb .
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
=> Bundling gems
Calculating dependencies...
Updating source: http://gems.rubyforge.org
Downloading appengine-apis-0.0.14.gem
Installing appengine-apis (0.0.14)
Done.
=> Packaging gems
中略
2010/05/04 4:40:47 com.google.apphosting.utils.jetty.JettyLogger info
???: Started SelectChannelConnector@127.0.0.1:8080
The server is running at http://localhost:8080/

試したいこと。その2

jrubyから単体テストを実行するようなケースでappengine-apisにno such file to loadエラーがでるとき。

$ jruby -S spec spec/なんとかかんとか_spec.rb
#<LoadError: no such file to load -- appengine-apis>
中略
/opt/local/share/java/jruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require': no such file to load -- appengine-apis (LoadError)
	from /opt/local/share/java/jruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
中略


コード内に「試したいこと。その1」のようにrequire 'appengine-apis' を追記してもエラーは解消しませんでした。
その時のgemの状態です。いずれもgem install google-appengineではインストールしたものです。

$
$ jgem list | grep -E '(appengine|bundler)'
appengine-jruby-jars (0.0.7.pre)
appengine-rack (0.0.7)
appengine-sdk (1.3.2)
appengine-tools (0.0.11)
bundler08 (0.8.5)
google-appengine (0.0.11)
$ 
$


appengine-apisは含まれていない。これが必要なのかな?
後先考えずにインストール!!

$ sudo jgem install appengine-apis

再実行するとエラーメッセージが変わった!!
SyntaxErrorです。バグでしょうか?
syntax error in testing.rb ...

$
$ jruby -S spec spec/なんとかかんとか_spec.rb
#<SyntaxError: /opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/appengine-apis-0.0.14/lib/appengine-apis/testing.rb:59: , unexpected tRPAREN

          configs = nil if ENV['SKIP_LOCAL_SERVICE_APIS')
                                                        ^
中略

確かにカッコの対応がおかしいのようです。
後先考えずに、gemのコードを直に修正します。(自己責任でどうぞ)

before

          configs = nil if ENV['SKIP_LOCAL_SERVICE_APIS')

after

          configs = nil if ENV['SKIP_LOCAL_SERVICE_APIS']


通った!!