依赖性是一种源代码依赖性提取工具,旨在从各种编程语言中推断源代码实体(例如文件和方法)之间的句法关系。我们的目标是提供一个易于扩展的框架,以支持从不同的编程语言和配置文件中提取依赖关系,以便以独立于语言的方式在其上构建其他高级分析工具。示例应用程序包括代码可视化,程序理解,代码气味检测,体系结构分析,设计重构等。
我们的依赖创建是由观察结果激发的,即不同的供应商(例如Leach™,Construct 101™和Lattix™)创建了自己的依赖性提取工具,这些工具包装了其他分析功能。为了进行新的分析,供应商和研究人员必须各自创建自己的依赖提取工具,或使用其他工具的输出,这些工具通常无法重复使用。
我们认为,软件源代码的依赖性分析是软件工程最重要的基础之一。鉴于越来越多的系统建立在新语言和多语言上,因此需要广泛认识到一个灵活的,可扩展的多语言依赖性提取框架,并具有简单和统一的接口。
依赖是开源的,可以自由,以促进社区合作,避免重复性工作以及提高分析工具的质量。
您可以从https://github.com/multilang-deperds/deppers/releases/下载最新版本的依赖版本
然后在计算机的任何目录中解压缩depends-*version*.tgz
文件。
依赖性用Java编写,因此可以在任何具有JRE或JDK环境的OS上运行(例如Windows,Linux或Mac OS)。
遵循单一责任原则,依赖的目的是仅提取依赖性。它仅提供CLI接口,没有GUI。但是您可以将依赖的输出转换为其他工具的GUI,例如GraphViz(http://graphviz.org/),Plantuml(http://plantuml.com/)和DV8(https:// www。 Artdia.com)。
您可以按以下方式运行以下方式: depends.sh
于Linux/Mac的sh, depends.bat
于Microsoft Windows或java -jar depends.jar
。
注意:如果您遇到的内存错误(例如GC overhead limt exceed
,请像以下java -Xmx4g -jar depends.jar <args>
那样展开JVM内存。
CLI工具的用法可以由depends --help
,如以下内容:
Usage: depends [-hms] [--auto-include] [-d=<dir>] [-g=<granularity>]
[-p=<namePathPattern>] [-f=<format>[,<format>...]]...
[-i=<includes>[,<includes>...]]... <lang> <src> <output>
<lang> The language of project files: [cpp, java, ruby, python,
pom]
<src> The directory to be analyzed
<output> The output file name
--auto-include auto include all paths under the source path (please
notice the potential side effect)
-i, --includes=<includes>[,<includes>...]
The files of searching path
-d, --dir=<dir> The output directory
-f, --format=<format>[,<format>...]
The output format: [json(default),xml,excel,dot,
plantuml]
-g, --granularity=<granularity>
Granularity of dependency.[file(default),method,L#(the level of folder. e.g. L1=1st level folder) ]
-h, --help Display this help and exit
-s, --strip-leading-path Strip the leading path.
-m, --n-map-files Output DV8 dependency map file.
-p, --namepattern=<namePathPattern>
The name path separators.[default(/),dot(.)
要运行依赖,您需要指定3个最重要的参数:如上所述, lang
, src
, output
。
请注意,对于大多数编程语言,例如C/C++, Ruby, Maven/Gradle
, --includes
Path对于在进行代码依赖性分析时,与MakeFile/IDE相似的代码依赖性分析时,依赖的路径很重要。否则,提取的依赖项可能不准确。
请勿指定SRC目录之外的路径(例如,系统级别包括路径或外部依赖关系),因为依赖不会处理它们。
--auto-include
是一个有用的参数,可以简化include dirs的输入:使用此参数,依赖将包括src
的所有子目录。
对于Java
程序,您无需指定路径,因为Java文件路径之间的映射在导入语句中明确说明。
依赖的输出可以将其导出为5种格式:JSON,XML,Excel,Dot和Plantuml。由于MS Excel的限制,如果元素的数量小于256,则只能导出到Excel文件中。)
点文件可用于使用GraphViz(http://graphviz.org/)生成图形。
Plantuml文件可用于使用Plantuml(http://plantuml.com/)生成UML图。
JSON和XML文件可用于使用DV8(https://www.archdia.net)生成设计结构矩阵(DSM)。
JSON/XML格式的细节可以在此处找到。
依赖性支持主要的依赖类型,包括:
import
,C/C ++ #include
,Ruby require
。有关支持类型的详细信息,请参考此处
有很多方法可以贡献依赖。例如:
依赖性实现了依赖性分析的优美内核,可以扩展以适应各种编程语言。到目前为止,它仅支持Java,C/C ++,Ruby和Maven。请随时利用此框架来添加您自己的依赖提取器。
每种语言所需的努力差异很大。我们花了24个小时来支持Maven,但花了数周的时间从Ruby提取依赖性
解析源文件并非微不足道。需要考虑许多特定于语言的功能。报告不支持的语言功能或解决现有问题将使依赖更好。
您可以使用依赖作为构建块来创建各种开源或商业工具,用于制作或研究,例如GUI工具,代码可视化工具等。
如果您的公司或研究所成为我们项目的赞助商,这将为我们提供很多帮助。您的捐款可能有助于取决于独立,可持续和支持更多贡献者。
欢迎您在您的项目中使用“取决于”的开源或商业项目以及软件工程研究。高度赞赏您的反馈。如果您能帮助我们传播这些单词并鼓励更多人使用它,我们也将很感激。
该项目建立在其他研究人员的出色工作基础上,包括Jin Wuxia等人提出的Enre框架(https://github.com/jinwuxia/enre),以及Yuanfang Cai教授团队的建筑研究( https://www.cs.drexel.edu/~yfcai/)关于依赖性分析。
语言特定的依赖的前端基于几个出色的开源项目,包括Antlr/Antlr语法V4(https://github.com/antlr),Eclipse CDT(www.eclipse.org/cdt)和Jruby( https://github.com/jruby/jruby)。