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

我正在使用的一些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')) 

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

为什么作者这样做?

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

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

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

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

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

  1. 在ruby命令行上添加-I选项
  2. 修改源中的$ LOAD_PATH变量
  3. 玩环境变量RUBYLIB

解决方案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是不可取的,您对环境变量的依赖性越小,您就越好。