如何在Roda项目中让Zeitwerk仅自动加载指定单个文件
解决方案
有两种简洁的方案可以实现你的需求,无需移动config/application.rb文件:
方案一:使用push_dir的matcher参数(推荐)
Zeitwerk的push_dir方法支持matcher选项,通过正则表达式指定只加载目录下符合规则的文件。直接给config目录设置仅匹配application.rb的规则即可:
loader = Zeitwerk::Loader.new loader.push_dir('lib') # 仅加载config目录下的application.rb文件 loader.push_dir('config', matcher: /application\.rb$/) if ENV['RACK_ENV'] == 'development' loader.enable_reloading loader.setup run ->(env) do loader.reload Application.call(env) end else loader.setup loader.eager_load run Application.freeze.app end
原理:matcher参数会让Zeitwerk扫描config目录时,只处理匹配正则表达式/application\.rb$/的文件,自动忽略其他所有文件。
方案二:通过ignore排除指定文件
如果偏好显式排除的方式,可以先将整个config目录加入加载路径,再排除除application.rb外的所有.rb文件:
loader = Zeitwerk::Loader.new loader.push_dir('lib') loader.push_dir('config') # 排除config目录下所有非application.rb的rb文件 loader.ignore(*Dir.glob("config/*.rb").reject { |path| path == "config/application.rb" }) if ENV['RACK_ENV'] == 'development' loader.enable_reloading loader.setup run ->(env) do loader.reload Application.call(env) end else loader.setup loader.eager_load run Application.freeze.app end
原理:利用Dir.glob获取config目录下所有.rb文件,再通过reject筛选出需要保留的application.rb,剩下的文件全部传给loader.ignore排除。
两种方案都能实现你的需求,方案一更简洁高效,推荐使用。
内容的提问来源于stack exchange,提问作者svoop
相关产品推荐
相关产品推荐

