需要 ruby 个宝石,结果不一

Requiring ruby gems giving mixed results

今天发现运行require fileutils在撬总是returns假。但是,如果我在 irb 中做同样的事情,它 returns 是正确的。此外,当 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)

示例:

首先我用撬来制作一些文件夹。 fileutils 是否已加载?请注意,即使 fileutils returns 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"]

这让我大吃一惊。即使我在 irb 中将 'fileutils' 设置为 false,它仍然有效:

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"]

首先,FileUtils 不是 gem,因此它永远不会显示为 gem 依赖项。

其次,require的return值并没有告诉你请求是否成功(如果失败,它会引发异常)。 false 表示它已经加载。你的陈述

Even after I set 'fileutils' to false in irb

没有意义。你根本没有设置任何东西,你只是再次调用 require 并且第二次调用 returns false。

您所观察到的只是意味着 pry(或其依赖项之一)直接加载 FileUtils 或加载一些加载 FileUtils 的标准库。看起来 pry 需要 'tempfile',它本身需要 'tmpdir',而后者又需要 'fileutils'。