Dlaczego Ruby 1.9.2 usuwa "."ze ścieżki ładowania, a jaka jest alternatywa?
Najnowsze zestawy zmian do Ruby 1.9.2 nie sprawiają już, że bieżący katalog .
jest częścią twojego LOAD_PATH
. Mam nietrywialną liczbę plików RAKEFILE, które zakładają, że .
jest częścią LOAD_PATH
, więc to je złamało( zgłosili "nie ma takiego pliku do załadowania" dla wszystkich instrukcji require, które opierają się na ścieżce projektu). Czy było ku temu jakieś szczególne uzasadnienie?
Jeśli chodzi o poprawkę, dodawanie $: << "."
wszędzie działa, ale wydaje się niesamowicie hakerskie i nie chcę tego robić. Jaki jest preferowany sposób, aby mój Rakefiles 1.9.2+ kompatybilny?
7 answers
Uznano to za zagrożenie "bezpieczeństwa".
Możesz obejść go za pomocą ścieżek bezwzględnych
File.expand_path(__FILE__) et al
Lub robić
require './filename' (ironically).
Lub za pomocą
require_relative 'filename'
Lub dodanie katalogu "include"
ruby -I . ...
Lub to samo, używając irb;
$irb -I .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 18:35:49
Są dwa powody:
- solidność i
- Bezpieczeństwo
Oba są oparte na tej samej podstawowej zasadzie: ogólnie rzecz biorąc, po prostu nie możesz wiedzieć, co to jest bieżący katalog, kiedy twój kod jest uruchamiany. Co oznacza, że gdy potrzebujesz pliku i zależy od tego, czy znajduje się on w bieżącym katalogu, nie masz możliwości kontrolowania, czy ten plik w ogóle tam będzie, czy jest to plik, którego rzeczywiście oczekujesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-25 07:17:53
Jak wskazują inne odpowiedzi, jest to zagrożenie bezpieczeństwa, ponieważ .
w ścieżce ładowania odnosi się do bieżącego katalogu roboczego Dir.pwd
, a nie do katalogu bieżącego ładowanego pliku. Więc ktokolwiek wykonuje Twój skrypt może to zmienić po prostu przez cd
ing do innego katalogu. Niedobrze!
Jako alternatywę używam pełnych ścieżek zbudowanych z __FILE__
.
require File.expand_path(File.join(File.dirname(__FILE__), 'filename'))
W przeciwieństwie do require_relative
, jest to wstecznie kompatybilne z Rubim 1.8.7.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-18 06:50:08
Użyj require_relative 'file_to_require'
Wrzuć to do kodu, aby require_relative działał w 1.8.7:
unless Kernel.respond_to?(:require_relative)
module Kernel
def require_relative(path)
require File.join(File.dirname(caller.first), path.to_str)
end
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 18:20:52
'.'in your path jest od dawna uważane za złą rzecz w świecie Uniksa (patrz np. http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). zakładam, że ludzie z Ruby zostali przekonani o mądrości, aby tego nie robić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-25 07:32:48
Uznałem to za mylącą zmianę, dopóki nie zdałem sobie sprawy z kilku rzeczy.
Możesz ustawić RUBYLIB w swoim .profil (Unix) i kontynuuj życie tak jak wcześniej:
export RUBYLIB="."
Ale jak wspomniano powyżej, od dawna uważano to za niebezpieczne.
W zdecydowanej większości przypadków można uniknąć problemów, po prostu wywołując Skrypty Ruby z prepended '."np./ scripts / server.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 21:45:47
Jak zauważył Jörg W Mittag, myślę, że to, czego chcesz użyć, to require_relative
, więc wymagany plik jest względny do pliku źródłowego deklaracji require
, a nie do bieżącego katalogu roboczego.
Twoje zależności powinny być względem Twojego pliku rake.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-31 04:31:03