我有一个Ruby程序,它是一个非常大的代码库的一部分,我想在其他地方提取和使用。
有问题的程序需要位于不同目录中的其他几个文件,而这些文件又依赖于其他几个文件,依此类推。
有没有一种快速的方法可以获得这个程序所依赖的所有文件的列表,以及它们所在的目录,这样我就能拿出我需要的东西?
如果我在IRB中加载文件,我觉得必须有一些方法可以看到这个,但我不能想到我可能需要哪种方法或模块来进行这种内省。谷歌搜索也没有多大帮助。
答案 0 :(得分:1)
如果您对启发式方法持开放态度,您可以选择一些选项。
是否有任何类型的顶级目录中的所有文件,例如" / foo / bar /"?
您是否只能运行Ruby程序,而不是其他大型代码库?
如果是,那么您可以找到Ruby程序触及的所有目录和文件:
find /foo/bar -atime -1
此选项的一个优点是可以找到程序所需的Ruby代码和资产,例如css,images,javascripts等。
警告:如果命令没有显示任何内容,那么您的文件系统可能会暂停一天的atime设置;了解更多google" noatime"。
与上面的-atime解决方案类似,DTrace可以分析正在运行的应用程序并报告访问哪些文件。
此选项的一个优点是,您可以在程序运行时获得实时结果,并且可以仅附加到程序进程。
如果您只对运行的Ruby代码感兴趣,对资产不感兴趣,那么您可以拦截Ruby文件的require方法。
module Kernel
alias_method :old_require, :require
def require(name)
puts "requiring #{name}"
old_require(name)
end
end
此解决方案的一个优点是它只显示Ruby可运行文件,而不显示任何资产。
一个优点是您可以使用条件逻辑ad-hoc提取代码。例如,您可以提取包含" hello"的所有项目。进入这样的不同目录:
def require(name)
if name=~/hello/
# Whatever logic you want goes here,
# such as dynamically altering the load path,
# or altering the name, or skipping the require.
end
old_require("#{my-original-location}/name")
end
此解决方案与上述其他解决方案的一个警告是,您无法检测使用非典型方式加载的Ruby代码,例如使用File.read
然后eval
。
如果您的应用有Gemfile,那么这是寻找主要依赖关系的好地方。
如果您的应用使用git子模块,那么这是另一个值得关注的好地方。
如果您的应用有测试套件,请务必运行它,以便获得所有测试套件文件。
如果您的应用具有动态需要的文件或仅在某些执行路径上加载的文件,则您需要以与运行应用程序不同的方式找到它们。理想情况下,您的测试套件将运行所有动态需要的文件。
如果您没有测试套件,或者套件不彻底,您可能需要先编写一些简单的功能测试。您不需要100%的测试覆盖率,并且您不需要专注于单元测试;你需要足够的烟雾测试来检测你是否在提取碎片时意外破坏了主要功能。
如果您的代码很重要,请在代码库中搜索eval
方法,File
类,IO
类等的任何内容。您要做什么?寻找代码和/或资产的任何动态加载。