gpt4 book ai didi

ruby-on-rails - "require File.dirname(__FILE__)"-- 如何安全地解除文件系统依赖?

转载 作者:数据小太阳 更新时间:2023-10-29 06:44:13 24 4
gpt4 key购买 nike

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

方案三不可取,对环境变量的依赖越少越好。

关于ruby-on-rails - "require File.dirname(__FILE__)"-- 如何安全地解除文件系统依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com