“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搜索路径,可以通过多种方式执行此操作:
- 在ruby命令行上添加-I选项
- 修改源中的$ LOAD_PATH变量
- 玩环境变量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是不可取的,您对环境变量的依赖性越小,您就越好。