“require File.dirname(__ FILE__)” - 如何安全地撤消文件系统依赖?

时间:2009-06-25 12:34:09

标签: ruby-on-rails ruby filesystems dependencies

我正在使用的一些Ruby库使用这样的require语句:

require File.dirname(__FILE__) + '/specification_helper.rb'

lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "lib"))

require File.join(File.dirname(__FILE__), 'lib/tools', 'version')

require File.expand_path(File.join(File.dirname(__FILE__), 'datautils', 'conn'))

这种格式是否会使您的代码不必要地依赖于文件系统的结构?

为什么作者这样做?

是否可以(安全地)更改此代码以消除对文件系统的依赖性?

1 个答案:

答案 0 :(得分:10)

我实际上在生产代码中使用这个方案。

要求相对于当前源位置的文件有几个优点:

  • 源树可以作为一个整体移动并保持可用,因为我们需要相对于彼此的源。
  • 因为我们使用完整路径,所以我们避免意外冲突(在另一个库中加载具有相同名称的源,或者重新加载相同的源两次)
  • 无需修改ruby的搜索路径即可使用代码

如果您更喜欢使用修改后的ruby搜索路径,可以通过多种方式执行此操作:

  1. 在ruby命令行上添加-I选项
  2. 修改来源
  3. 中的$ LOAD_PATH变量
  4. 使用环境变量RUBYLIB
  5. 解决方案1意味着控制如何调用ruby。您需要一个脚本来启动该程序,例如:

    @echo off
    REM my_script.cmd
    set srcdir=%~dp0\..\path\to\source
    ruby -I %srcdir% %srcdir%\my_script.rb
    

    或者:

    #!/bin/sh
    srcdir=$(cd $(dirname $0)/../path/to/source && pwd)
    exec ruby -I $srcdir $srcdir/my_script.rb
    

    解决方案2可行,但不会避免碰撞。您通常会执行以下操作:

    $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
    

    解决方案3是不可取的,您对环境变量的依赖性越小,您就越好。