为什么在从控制器或模型调用时需要完全修改mysqldump?

时间:2009-11-26 13:41:06

标签: ruby-on-rails ruby rake mysqldump

当我从控制器或模型中调用mysqldump时,我需要完全路径二进制文件,当我从Rake调用它时我不需要。

如果我没有完全路径,我会得到一个零字节文件...

我可以确认两个进程都是使用同一个用户运行的。

# Works in a controller, model and Rake task
system "/usr/local/mysql/bin/mysqldump -u root #{w.database_name} > #{target_file}"

# Only works in a Rake task
system "mysqldump -u root #{w.database_name} > #{target_file}"

如果我从动作中调用Rake任务,它也会失败(零字节文件)。

操作系统:Mac Ruby 1.8.6

编辑:我使用Etc.getpwuid(Process.uid).name来获取当前流程的用户

2 个答案:

答案 0 :(得分:1)

当然,您始终可以根据需要修改PATH环境变量。这样的事情最好在environment.rb或您的特定环境配置中完成:

add_paths = %w[ /usr/local/mysql/bin /opt/local/bin ]
ENV['PATH'] = (ENV['PATH'].split(/:/) + add_paths).uniq.select do |p|
  File.exist?(File.expand_path(p))
end.join(':')

这样,您可以在路径中添加任意元素(如果它们存在于您的系统中)。

答案 1 :(得分:0)

我最近发现Passenger(mod_rails)不会像Mongrel一样在shell中运行,这在您考虑时很明显。因此它'继承'完整系统$ PATH。