在ruby中需要一个文件在同一个目录下吗?
是否有一个简短的方法来要求位于同一目录(作为脚本执行)的文件?
require File.expand_path(File.dirname(__FILE__) + '/some_other_script')
我读了require "my_script"
并require "./my_script"
实际上将加载脚本两次(ruby不会认识到,它实际上是相同的脚本),这就是为什么build议File.expand_path
的原因:如果它被使用每次脚本是必需的,那么它只会被加载一次。
对我来说,像Ruby这样简洁的语言似乎没有一个简短的解决scheme似乎很奇怪。 例如,Python只是有这个:
import .some_other_module_in_the_same_directory
我想我可以猴子补丁require
…但这只是邪恶的! 😉
由于ruby1.9可以使用require_relative
。
只需要filename
。
是的,如果将它指定为filename
和./filename
,它会导入两次,所以不要这样做。 你没有指定.rb
,所以不要指定path。 我通常把我的应用逻辑的大部分放到一个lib
文件中,然后在bin
中有一个脚本,如下所示:
#!/usr/bin/env ruby $: << File.join(File.dirname(__FILE__), "/../lib") require 'app.rb' App.new.run(ARGV)
另一个好处是,如果加载应用程序逻辑不会自动开始执行,我觉得更容易进行unit testing。
即使从其他目录运行脚本,以上方法也是可行的。 然而,在同一个目录下,你所指的工作按预期工作,至less对于ruby 1.9来说,不会导致双重要求。
testa.rb
puts "start test A" require 'testb' require './testb' puts "finish test A"
testb.rb
puts "start test B" puts "finish test B"
运行'ruby testa.rb'会导致:
start test A start test B finish test B finish test A
但是,更长的表单将工作,即使从另一个目录(例如ruby somedir / script.rb)
把它放在一个标准的库目录(已经在你的默认加载path$:
某个地方):
# push-loadpath.rb if caller.first $: << File.expand_path(File.dirname(caller.first)) end
那么,这应该工作
% ls /path/to/ bin.rb lib1.rb lib2.rb #... % cat /path/to/bin.rb load 'push-loadpath.rb' require 'lib1' require 'lib2' #...
caller
可以访问当前的调用堆栈,并告诉你什么文件和位置,所以push-loadpath.rb
使用它来添加load
到加载push-loadpath.rb
的文件。
请注意,您应该load
文件,而不是require
,因此可以多次调用正文(每次要更改加载path一次)。
或者,你可以用一种方法包裹身体,
# push-loadpath.rb def push_loadpath $: << File.expand_path(File.dirname(caller.first)) end
这将允许你require
它,并以这种方式使用它:
% ls /path/to/ bin.rb lib1.rb lib2.rb #... % cat /path/to/bin.rb require 'push-loadpath' push_loadpath require 'lib1' require 'lib2' #...