对于一个包含数千个文件的大型(非 Rails)Ruby 项目,这些文件不遵循类、模块和常量的命名约定,并且使用大量 require 和 require_relative 以及潜在的循环依赖项,是否有一种方法可以检测它们,以便可以应用纠正措施并允许采用代码加载器?
我找到了 Rails 项目的东西 https://github.com/rails/rails/blob/main/railties/lib/rails/zeitwerk_checker.rb
require
和require_relative
调用并不重要,因为如果您迁移,它们将被删除。
解决此问题的一种方法是立即加载项目,迭代
ObjectSpace
以打印路径位于项目中的类和模块的 const_source_location
。
然后,在尚未驱动项目的临时脚本中,实例化 Zeitwerk 加载器,设置其根目录或目录,然后检查
loader.all_expected_cpaths
。此方法为您提供具有给定配置的项目中预期的恒定路径,并且它不会加载代码。因此,即使该项目不是由 Zeitwerk 管理,您也可以运行它。
这两个数据源可以进行比较,并可以为您提供一个指标。
为了使两者趋同,您通常会移动一些东西。您可以在留在项目中的同时执行此操作。只需移动文件,将一项内容放入一个文件中,然后修改
require
和 require_relative
调用,以便项目仍然有效(假设这些不是公共接口并且您可以更改位置)。
重新组织后,您可以根据需要重命名常量,或使用词形变化使它们保持原样。