问题 “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'))

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

为什么作者这样做?

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


10117
2018-06-25 12:34


起源

另请参阅codemeta.source_pdir en.wikibooks.org/wiki/AnyLang_Programming_Language_Comparison/... - dreftymac


答案:


其实我 使用 生产代码中的这个方案。

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

  • 源树可以作为一个整体移动并保持可用,因为我们需要相对于彼此的源。
  • 因为我们使用完整路径,所以我们避免意外冲突(在另一个库中加载具有相同名称的源,或者重新加载相同的源两次)
  • 可以使用代码而无需修改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是不可取的,您对环境变量的依赖性越小,您就越好。


10
2018-06-25 13:16