代码之家  ›  专栏  ›  技术社区  ›  John Feminella

为什么Ruby1.9.2会从LOAD\u路径中删除“.”,还有什么选择呢?

  •  154
  • John Feminella  · 技术社区  · 16 年前

    Ruby1.9.2的最新变更集不再使当前目录 . 你生活的一部分 LOAD_PATH . 我有大量的耙子假设 是这个计划的一部分 加载路径

    至于修复,添加 $: << "." 任何地方都可以,但似乎令人难以置信的黑客,我不想这样做。让我的Rakefiles 1.9.2+兼容的首选方法是什么?

    7 回复  |  直到 15 年前
        1
  •  141
  •   rogerdpack    8 年前

    这被认为是一种“安全”风险。

    你可以用绝对路径绕过它

    File.expand_path(__FILE__) et al
    

    或者做什么

    require './filename' (ironically).
    

    或者使用

    require_relative 'filename'
    

    或者添加一个“include”目录

    ruby -I . ...
    

    或相同,使用内部评级法;

    $irb -I .
    
        2
  •  34
  •   Jörg W Mittag    16 年前

    有两个原因:

    • 健壮性和

    两者都基于相同的基本原则:一般来说,当代码运行时,您根本无法知道当前目录是什么。这意味着,当您需要一个文件并且依赖于它在当前目录中时,您无法控制该文件是否会存在,或者它是否是您实际期望存在的文件。

        3
  •  16
  •   Jonathan Tran    15 年前

    正如其他答案所指出的,这是一种安全风险,因为 . 在加载路径中,引用当前工作目录 Dir.pwd cd 正在复制到另一个目录。不好的!

    我一直在使用由 __FILE__ 作为另一种选择。

    require File.expand_path(File.join(File.dirname(__FILE__), 'filename'))
    

    require_relative

        4
  •  8
  •   Tyler Brock    13 年前

    使用 require_relative 'file_to_require'

    在代码中加入这一点,使1.8.7中的require\u相对工作:

    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
    
        5
  •  6
  •   Rodger    16 年前

    在Unix世界中,“.”一直被认为是一件坏事(例如, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). 我想Ruby的人已经被说服了不这么做是明智的。

        6
  •  3
  •   Dylan    15 年前

    您可以在.profile(Unix)中设置RUBYLIB,然后像以前一样继续生活:

    export RUBYLIB="."

    但如上所述,这样做长期以来被认为是不安全的。

    在绝大多数情况下,您可以通过简单地调用带有前缀“.”的Ruby脚本来避免问题,例如../scripts/server。

        7
  •  3
  •   Bad Request    12 年前

    正如jrgw Mittag所指出的,我认为您想要使用的是 require_relative require 声明而不是当前工作目录。

    依赖项应该与rake构建文件相关。

    推荐文章