当我从控制器或模型调用 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 来获取当前进程的用户

有帮助吗?

解决方案

当然,您始终可以根据需要修改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(':')

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top