Encontrando bibliotecas relativas ao usar links simbólicos para ruby ??executáveis

StackOverflow https://stackoverflow.com/questions/322769

  •  11-07-2019
  •  | 
  •  

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 __FILE__ para $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?

Foi útil?

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"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top