Os últimos conjuntos de alterações no Ruby 1.9.2 não fazem mais o diretório atual .
parte do seu LOAD_PATH
. Eu tenho um número não trivial de Rakefiles que assumem que .
faz parte do LOAD_PATH
, então isso os quebrou (eles relataram "nenhum arquivo para carregar", pois todos exigem instruções baseadas no caminho do projeto). Havia uma justificativa específica para fazer isso?
Quanto a uma correção, adicionar em $: << "."
qualquer lugar funciona, mas parece incrivelmente hacky e eu não quero fazer isso. Qual é a maneira preferida de tornar meu Rakefiles 1.9.2+ compatível?
require_relative
. Obrigado.require './filename'
funciona apenas se o seu script for executado com o diretório de trabalho definido no mesmo diretório em que o script reside. Isso geralmente não é o caso em projetos com vários diretórios.Há duas razões:
Ambos são baseados no mesmo princípio subjacente: em geral, você simplesmente não pode saber qual é o diretório atual quando seu código é executado. O que significa que, quando você exige um arquivo e depende que ele esteja no diretório atual, você não tem como controlar se esse arquivo estará lá ou se é o arquivo que você realmente espera estar lá.
fonte
.
, ou seja, o diretório de trabalho atual. Se o usuário estivercd
em um diretório diferente, o diretório de trabalho atual será alterado e agora você terá arquivosrequire
completamente diferentes, dependendo do diretório em que o usuário estava quando chamou o script. Não acho que seja uma boa ideia.$: << File.dirname(__FILE__)
lib
diretório está no$LOAD_PATH
e entãorequire
todos os arquivos relativos alib
. Em outras palavras: deixo para o administrador descobrir como configurar$LOAD_PATH
corretamente. Se você usa RubyGems, isso é trivial, porque o RubyGems faz isso automaticamente para você, e se você usa pacotes Debian, esse é o trabalho do mantenedor de pacotes. Em suma, parece funcionar muito bem..
de$LOAD_PATH
, Ruby 1.9.2 introduzrequire_relative
que ... surpresa ...require
arquivo de sa em relação à localização do arquivo atualmente em execução (ou seja, em relação aoFile.dirname(__FILE__)
).Como outras respostas apontam, é um risco de segurança, porque
.
no caminho de carregamento refere-se ao diretório de trabalho atualDir.pwd
, não ao diretório do arquivo atual que está sendo carregado. Portanto, quem estiver executando seu script pode mudar isso simplesmentecd
inserindo outro diretório. Não é bom!Eu tenho usado caminhos completos construídos
__FILE__
como uma alternativa.Ao contrário
require_relative
, isso é compatível com o Ruby 1.8.7.fonte
require Pathname.new(__FILE__).dirname + 'filename'
Usar
require_relative 'file_to_require'
Jogue isso no seu código para fazer o require_relative funcionar na 1.8.7:
fonte
'.' em seu caminho há muito tempo é considerado uma coisa ruim no mundo Unix (veja, por exemplo, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). Suponho que o pessoal do Ruby tenha sido persuadido da sabedoria de não fazer isso.
fonte
Achei isso uma mudança confusa, até que percebi algumas coisas.
Você pode definir o RUBYLIB no seu .profile (Unix) e continuar com a vida como fez antes:
export RUBYLIB="."
Mas, como mencionado acima, há muito tempo é considerado perigoso fazê-lo.
Na grande maioria dos casos, você pode evitar problemas simplesmente chamando seus scripts Ruby com um '.' por exemplo ./scripts/server.
fonte
Como Jörg W Mittag apontou, acho que o que você deseja usar é
require_relative
que o arquivo necessário seja relativo ao arquivo de origem darequire
declaração e não ao diretório de trabalho atual.Suas dependências devem ser relativas ao seu arquivo rake build.
fonte