ここで少し謎を解こうとしています... cron 経由で呼び出される gem を作成しました。
謎は次のとおりです。これはマシン上では機能しますがA
、マシン上では機能しませんB
。私が知る限り、環境は同じです。
どちらのマシンも Mac OS X 10.6 です。
また、cron が最小限の環境で実行されることも理解しています。
crontab:
10 2 * * * /Users/michael/.rvm/gems/ruby-1.9.3-p194/bin/my_gem
マシン上のエラーB
は次のとおりです。
/Users/michael/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find my_gem-toolchain (>= 0) amongst [bigdecimal-1.1.0, io-console-0.3, json-1.5.4, minitest-2.5.1, rake-0.9.2.2, rdoc-3.9.4] (Gem::LoadError)
from /Users/michael/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
from /Users/michael/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems.rb:1231:in `gem'
from /Users/michael/.rvm/gems/ruby-1.9.3-p194/bin/my_gem:22:in `<main>'
内容はこちら/Users/michael/.rvm/gems/ruby-1.9.3-p194/bin/my_gem
#!/Users/michael/.rvm/rubies/ruby-1.9.3-p194/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'my_gem-toolchain' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/
version = $1
ARGV.shift
end
end
gem 'my_gem-toolchain', version
load Gem.bin_path('my_gem-toolchain', 'my_gem', version)
22 行目は次のとおりです。gem 'my_gem-toolchain', version
env
以下は、両方のマシンで cron を使用して実行した場合の出力です。
SHELL=/bin/sh
USER=michael
PATH=/usr/bin:/bin
PWD=/Users/michael
SHLVL=1
HOME=/Users/michael
LOGNAME=michael
_=/usr/bin/env
これは、GEM_PATH
設定されていないことに関係していると思います。ただし、マシンでは設定されていないようA
にGEM_PATH
見えますが、すべてが機能しています。
ruby の仕組みについて理解を深めたいと思います。どうやら私はまだ何かが欠けているようです。
A
これがマシン上では機能するのに、マシン上では機能しないのはなぜB
ですか?