Por que a necessidade mysqldump para ser totalmente pathed quando chamado a partir de um controlador ou modelo?
-
05-07-2019 - |
Pergunta
Quando eu chamo mysqldump
de um controlador ou modelar Preciso caminho totalmente o binário, quando eu chamá-lo de Rake Eu não preciso.
Se não faço totalmente caminho eu recebo um arquivo de zero byte ...
Eu posso confirmar ambos os processos são executados utilizando o mesmo usuário.
# 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}"
Se eu chamar a tarefa Rake da ação também falhar (arquivo de byte zero).
OS: Mac Ruby 1.8.6
EDIT: Eu uso Etc.getpwuid(Process.uid).name
para obter o usuário do processo atual
Solução
Você sempre pode modificar sua variável de ambiente PATH, conforme necessário, é claro. Algo como isso é feito melhor em environment.rb ou seu ambiente específico config:
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(':')
Desta forma, você pode adicionar elementos arbitrários para o seu caminho, se eles existem em seu sistema.
Outras dicas
Recentemente eu descobri passageiros (mod_rails) não é executado em um shell como Mongrel, o que é óbvio quando você pensa sobre isso. Por isso ele faz não 'herdar' a plena sistema $ PATH.