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?

Author: Milele, 2010-05-24

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 .
 141
Author: rogerdpack,
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.

 34
Author: Jörg W Mittag,
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.

 16
Author: Jonathan Tran,
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
 8
Author: Tyler Brock,
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ć.

 6
Author: Rodger,
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.

 3
Author: Dylan,
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.

 3
Author: Martin,
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