Encontrando bibliotecas relativas ao usar links simbólicos para ruby ??executáveis
Pergunta
Imagine que você tem um foo.rb executável, com bibliotecas bar.rb deitei-se da seguinte maneira:
<root>/bin/foo.rb
<root>/lib/bar.rb
No cabeçalho da foo.rb você colocar a seguinte necessitam para trazer funcionalidade em bar.rb:
require File.dirname(__FILE__)+"../lib/bar.rb"
Isso funciona bem, desde que todas as chamadas para foo.rb são diretos. Se você colocar como dizer $ HOME / projeto e foo.rb link simbólico para $HOME/usr/bin
, então resolve
para __FILE__
$HOME/usr/bin/foo.rb
, e é, portanto, incapaz de localizar bar.rb
em relação ao dirname para foo.rb
.
Eu percebo que os sistemas de embalagem, tais como rubygems corrigir isso através da criação de um espaço de nomes para procurar a biblioteca, e que também é possível ajustar o LOAD_PATH usando $:
para incluir $HOME/project/lib
, mas parece que uma solução mais simples deve existir . Alguém já teve experiência com este problema e encontrou uma solução útil ou receita?
Solução
Eu sei que isto é idades de idade, mas eu só encontrei isto:
require 'pathname'
APP_ROOT = File.join(File.dirname(Pathname.new(__FILE__).realpath),'..')
Outras dicas
Você pode usar essa função para seguir quaisquer links simbólicos e retornar o caminho completo do arquivo real:
def follow_link(file)
file = File.expand_path(file)
while File.symlink?(file)
file = File.expand_path(File.readlink(file), File.dirname(file))
end
file
end
puts follow_link(__FILE__)
Provavelmente vale a pena mencionar que +
funciona muito bem com objetos Pathname
e também há método Kernel.Pathname
, então @ código original de Burke poderia ser ainda mais curto:
require 'pathname'
APP_ROOT = Pathname.new(__FILE__).realpath + "../../lib"