我试图在这里解决一些谜团......我们创建了一个通过 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
似乎没有设置,但一切正常。
我想更好地了解红宝石的工作原理。显然我仍然缺少一些东西。
为什么这可以在机器上工作,A
但不能在机器上工作B
?