我正在使用的一些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'))
这种格式是否会使您的代码不必要地依赖于文件系统的结构?
为什么作者这样做?
是否可以(安全地)更改此代码以消除对文件系统的依赖性?
答案 0 :(得分:10)
我实际上在生产代码中使用这个方案。
要求相对于当前源位置的文件有几个优点:
如果您更喜欢使用修改后的ruby搜索路径,可以通过多种方式执行此操作:
解决方案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是不可取的,您对环境变量的依赖性越小,您就越好。