Требование рубиновых драгоценных камней, дающих смешанные результаты
Заметил сегодня, что работает require fileutils
в pry всегда возвращает false. Но, если я делаю то же самое в irb, он возвращает true. Кроме того, когда fileutils установлен в false, он все еще работает!
Сначала я подумал, что fileutils является зависимостью pry, и это объясняет, почему это уже требуется. Но это не так. Я что-то упустил здесь?
[07:40] ~/Desktop $ gem dependency pry
Gem pry-0.10.2
bundler (~> 1.0, development)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
Gem pry-theme-1.1.3
bundler (~> 1.0, development)
coderay (~> 1.1)
json (~> 1.8)
Пример:
Сначала я использую pry для создания некоторых папок. Fileutils уже загружен? Обратите внимание, что хотя fileutils возвращает false, он все равно работает:
[07:44] ~/Desktop $ ls
[07:44] ~/Desktop $ ########## (nothing)
[07:44] ~/Desktop $ pry
[1] pry(main)> require 'fileutils'
=> false
[2] pry(main)> FileUtils::mkdir_p 'foo'
=> ["foo"]
[3] pry(main)> Dir.mkdir('bar')
=> 0
[4] pry(main)> Dir["/home/caveman/Desktop/*"]
=> ["/home/caveman/Desktop/foo", "/home/caveman/Desktop/bar"]
Я удаляю только что созданные папки...
[07:48] ~/Desktop $ rm -r *
[07:48] ~/Desktop $ ls
[07:48] ~/Desktop $ ########## (nothing again)
Теперь я пытаюсь снова с IRB:
[07:49] ~/Desktop $ irb
irb(main):001:0> require 'fileutils'
=> true
irb(main):002:0> FileUtils::mkdir_p 'foo2'
=> ["foo2"]
irb(main):003:0> Dir.mkdir 'bar2'
=> 0
irb(main):004:0> Dir["/home/caveman/Desktop/*"]
=> ["/home/caveman/Desktop/bar2", "/home/caveman/Desktop/foo2"]
Вот что поражает меня. Даже после того, как я установил false для fileutils в irb, он все равно работает:
irb(main):005:0> require 'fileutils'
=> false
irb(main):006:0> FileUtils::mkdir_p 'foo3'
=> ["foo3"]
irb(main):007:0> Dir["/home/caveman/Desktop/*"]
=> ["/home/caveman/Desktop/foo3", "/home/caveman/Desktop/bar2", "/home/caveman/Desktop/foo2"]
1 ответ
Прежде всего, FileUtils не является гемом, поэтому он никогда не будет отображаться как зависимость от гема.
Во-вторых, возвращаемое значение require
не сообщает вам, успешно ли выполнено требование (если оно не выполнено, возникнет исключение). false
просто означает, что он уже загружен. Ваше заявление
Даже после того, как я установил для fileutils значение false в irb
не имеет смысла. Вы вообще ничего не устанавливаете, просто звоните require
снова и во второй раз он возвращает ложь.
То, что вы заметили, просто означает, что pry (или одна из его зависимостей) либо загружает FileUtils напрямую, либо загружает немного стандартной библиотеки, которая загружает FileUtils. Похоже, что pry требует 'tempfile', который сам требует 'tmpdir', который, в свою очередь, требует 'fileutils'.