如何以编程方式检测任何源代码 Repository/Directory 中使用的框架 and/or 库?
How can I detect the frameworks and/or libraries used in any Source Code Repository/Directory programatically?
假设我有一个源代码目录,我想要 运行 一个脚本来扫描目录中的代码和 return 其中使用的语言、框架和库。我试过 github/linguist,它是一个很棒的工具,甚至 Github 用来检测源代码中使用的编程语言,但是我无法超越它并准确检测框架。
我什至尝试了 it-depends 之类的工具来获取依赖项,但是,它变得一团糟。
有人可以帮我弄清楚如何使用现有工具来做这些事情,或者如果必须制作这样的工具我应该如何处理它。
提前致谢
这在一般情况下是不可能的。 halting problem 阻止任何程序在有限的时间内计算其他程序可以做什么或不可以做什么 - 包括它需要 运行 的依赖关系。当然,您可以让它适用于 一些 输入 - 但绝不能适用于所有输入。
所以你不得不妥协:
- 您需要支持哪些语言?例如,
it-depends
不会尝试支持 Java。不同的语言有不同的方式从它们的源代码中调用依赖项。例如,如果使用 C,您需要查看 #include
s.
- 您需要支持哪些 build-chains?为
C
解析标准 Makefile
与为 Java
查看 Maven pom.xml
有很大不同。此外,构建链可以执行任意计算——同样,由于停止问题,您的依赖项检测程序将无法“静态地”找出预期的行为。根据检测到的内容,完全有可能 link 针对一个库或另一个库(或 none )。在这种情况下你应该输出什么?对于没有记录构建过程的程序,您根本无法知道它们的依赖关系。通常,构建过程是人工记录的,但不是机器可读的...
- 您认为 library/framework 是什么?长期存在的库可以通过许多不同的版本发展,并且需要一个版本而不需要另一个版本的事实在源代码中可能并不明确。如果一个代码库依赖于仅在一个特定的、现在已被取代的库版本中发现的行为,并且没有发现该版本的明确提及——你的依赖检测程序将无法知道它(除非你编写代码在特定于库版本的检测中;这是可行的,但要视具体情况而定,并且需要深入了解版本之间的差异)。
因此,您问题的答案是... it depends (they go into a fair amount of detail regarding limitations). For the specific case of Java + Maven, which is not covered by it-depends
, you can use Maven itself, via mvn dependency:tree
。 选择问题的一个子集,而不是尝试一次解决所有问题。
假设我有一个源代码目录,我想要 运行 一个脚本来扫描目录中的代码和 return 其中使用的语言、框架和库。我试过 github/linguist,它是一个很棒的工具,甚至 Github 用来检测源代码中使用的编程语言,但是我无法超越它并准确检测框架。
我什至尝试了 it-depends 之类的工具来获取依赖项,但是,它变得一团糟。
有人可以帮我弄清楚如何使用现有工具来做这些事情,或者如果必须制作这样的工具我应该如何处理它。
提前致谢
这在一般情况下是不可能的。 halting problem 阻止任何程序在有限的时间内计算其他程序可以做什么或不可以做什么 - 包括它需要 运行 的依赖关系。当然,您可以让它适用于 一些 输入 - 但绝不能适用于所有输入。
所以你不得不妥协:
- 您需要支持哪些语言?例如,
it-depends
不会尝试支持 Java。不同的语言有不同的方式从它们的源代码中调用依赖项。例如,如果使用 C,您需要查看#include
s. - 您需要支持哪些 build-chains?为
C
解析标准Makefile
与为Java
查看 Mavenpom.xml
有很大不同。此外,构建链可以执行任意计算——同样,由于停止问题,您的依赖项检测程序将无法“静态地”找出预期的行为。根据检测到的内容,完全有可能 link 针对一个库或另一个库(或 none )。在这种情况下你应该输出什么?对于没有记录构建过程的程序,您根本无法知道它们的依赖关系。通常,构建过程是人工记录的,但不是机器可读的... - 您认为 library/framework 是什么?长期存在的库可以通过许多不同的版本发展,并且需要一个版本而不需要另一个版本的事实在源代码中可能并不明确。如果一个代码库依赖于仅在一个特定的、现在已被取代的库版本中发现的行为,并且没有发现该版本的明确提及——你的依赖检测程序将无法知道它(除非你编写代码在特定于库版本的检测中;这是可行的,但要视具体情况而定,并且需要深入了解版本之间的差异)。
因此,您问题的答案是... it depends (they go into a fair amount of detail regarding limitations). For the specific case of Java + Maven, which is not covered by it-depends
, you can use Maven itself, via mvn dependency:tree
。 选择问题的一个子集,而不是尝试一次解决所有问题。