通过cron执行rubygem

通过cron执行rubygem,ruby,path,gem,cron-task,Ruby,Path,Gem,Cron Task,我正试图解开这里的一个谜团。。。我们已经创建了一个名为via 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/l

我正试图解开这里的一个谜团。。。我们已经创建了一个名为via 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>'
第22行是:
gem'my_gem-toolchain',版本

以下是在两台机器上通过cron运行
env
的输出:

SHELL=/bin/sh
USER=michael
PATH=/usr/bin:/bin
PWD=/Users/michael
SHLVL=1
HOME=/Users/michael
LOGNAME=michael
_=/usr/bin/env
我认为这与未设置
GEM\u路径有关。但是,在机器
A
上,似乎未设置
GEM\u路径
,但一切正常

我想更好地理解ruby的工作原理。显然,我还缺少一些东西


为什么这在机器
A
上有效,而在机器
B
上无效?

RVM是开发人员维护环境的一个很好的工具,但在生产中却是一场噩梦。一旦您从cron执行了一些事情,您就基本上处于“生产”状态,以便维护一个执行环境,即使它恰好在您的开发机器上

我建议您在系统范围内安装gem,并从一个脚本运行它,该脚本对安装位置不作任何假设。确保遵循创建gem的所有最佳实践,以便正确安装gem的依赖项并正确处理二进制文件等。构建gem后,应通过系统Ruby进行安装,以便所有用户都可以使用操作系统Ruby解释器的默认位置,并且它的所有依赖项都已安装

查看Rubygems的最佳实践

然后使用系统ruby而不是RVM目录安装生成的gem文件:

rvm use system
gem install my-gem-1.0.0.gem
这应该得到一切设置,以便它从cron和任何用户都能愉快地运行。您可能不想在主目录中运行依赖RVM的cron作业


为了具体解决您的问题,有很多原因可以在a上工作,但在B上不工作。如果您在一台计算机上安装了gem系统范围,并在另一台计算机上通过RVM安装,这将影响依赖项的安装位置(系统范围与主目录中);如果你在另一台机器上连RVM都没有,那绝对是这样。可能是您的Gem没有正确声明其依赖项,因此当您在机器B上安装Gem时,依赖项没有安装在那里,但是您在开发过程中手动将它们安装在机器A上。这可能是因为您在两者上安装了相同的gems,并且主目录是共享的,其他所有内容看起来都是重复的,但是shell配置中的RVM魔法并没有在两者上执行。可能是不同的用户,因此环境不同。无论根本原因是什么,只要将RVM从等式中剔除,并遵循rubygems指南,你就会很好。

很好的解释,我仍在努力寻找根本原因。
rvm use system
gem install my-gem-1.0.0.gem