Min*_*ark 56 ruby path require
是否有更短的方法来要求位于同一目录中的文件(正在执行的脚本)?
require File.expand_path(File.dirname(__FILE__) + '/some_other_script')
Run Code Online (Sandbox Code Playgroud)
我读了这个require "my_script"并且require "./my_script"实际上会加载脚本两次(ruby不会认识到它实际上是同一个脚本),这File.expand_path就是推荐的原因:如果每次需要脚本时都使用它,那么它只会被加载一旦.
对我来说,像Ruby这样的简洁语言似乎没有更短的解决方案,这似乎很奇怪.例如,python只是这个:
import .some_other_module_in_the_same_directory
Run Code Online (Sandbox Code Playgroud)
我想我可以修补猴子require......但这只是邪恶的!;-)
dvo*_*rak 12
只需要filename.
是的,如果你指定它,因为它会导入两次filename和./filename,所以不这样做.您没有指定.rb,所以不要指定路径.我通常把我的应用程序逻辑的大部分放入一个文件中lib,然后有一个脚本bin,看起来像这样:
#!/usr/bin/env ruby
$: << File.join(File.dirname(__FILE__), "/../lib")
require 'app.rb'
App.new.run(ARGV)
Run Code Online (Sandbox Code Playgroud)
另一个优点是,如果加载应用程序逻辑没有自动开始执行它,我发现更容易进行单元测试.
小智 3
即使您从其他目录运行脚本,上述内容也将起作用。但是,在同一目录中,您引用的较短形式可以按预期工作,并且至少对于 ruby 1.9 不会导致双重要求。
puts "start test A"
require 'testb'
require './testb'
puts "finish test A"
Run Code Online (Sandbox Code Playgroud)
puts "start test B"
puts "finish test B"
Run Code Online (Sandbox Code Playgroud)
运行“ruby testa.rb”将导致:
start test A
start test B
finish test B
finish test A
Run Code Online (Sandbox Code Playgroud)
但是,较长的形式甚至可以在另一个目录中使用(例如 ruby somedir/script.rb)