“需要 File.dirname(__FILE__)” -- 如何安全地撤销文件系统依赖?

发布于 2024-07-25 00:24:53 字数 450 浏览 2 评论 0原文

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

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

作者为什么要这样做呢?

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

Some Ruby librararies I'm using use require statements like this:

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'))

Doesn't this format make your code needlessly dependent on the structure of the file system?

Why did the author do it this way?

Would it be possible to (safely) alter this code to remove this dependency on the filesystem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心是晴朗的。 2024-08-01 00:24:53

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

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

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

I actually use this scheme in production code.

Requiring files relative to the current source location has several advantages :

  • the source tree can be moved around as a whole and remains usable since we require sources relatively to each other.
  • since we use full paths, we avoid accidental collisions (loading a source with the same name in another library, or reloading the same source twice)
  • the code can be used without having to modify ruby's search path

Should you prefer to use a modified ruby search path, you can do it in multiple ways :

  1. adding -I options on the ruby command line
  2. modifying the $LOAD_PATH variable within the sources
  3. playing with the environment variable RUBYLIB

Solution 1 implies controlling how ruby is invoked. You'll need a script to start the program, such as:

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

Or:

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

Solution 2 is workable but does not avoid collisions. You'll typically do something like :

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

Solution 3 is unadvisable, the less dependencies you'll have toward environment variables, the better you will be.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文