如何在Delphi XE2中从所有源文件中删除未使用的单元?

17

如何在Delphi XE2项目的所有源文件中自动删除用途部分中未使用的单元?

P.S. 在此之后,IDE将会更加快速。


4
问题已经更加明确。请取消“被暂停”标志。对于使用Delphi进行大型项目的每位开发人员来说,这个问题非常重要,回答将非常有用。 - Dmitry
1
你能准确地定义“未使用单元”是什么意思吗?请注意,具有初始化代码的单元即使您没有引用其任何导出符号,也可能会对您的程序产生影响。 - David Heffernan
3
自动删除单位并不像你想的那么简单。一些单位具有初始化部分,可能会执行某些需要的操作(例如,调用 CoInitialize 来设置 COM),即使在单位中没有任何其他被调用的部分。(是的,我知道你可以手动调用 CoInitialize;重点是你不能总是自动地了解单位可能正在做什么。) - Ken White
5个回答

18

无法完全自动化。

我知道有一些采用向导方式的工具:

  • CnPack Uses Units Cleaner
  • Peganza's Pascal Analyzer(以及它的副产品icarus)。
  • The Lazarus IDE有一个“Unused Units”对话框,包含在其CodeTools软件包中。

Peganza的工具只是显示报告。 CnPack会提示您删除未使用的单元,但您必须确认操作。Lazarus向您显示了它认为未使用的单元列表,并让您选择删除其中的一些或全部。

为什么不能自动化?

因为这是静态分析。即使是最复杂的工具也不能以100%的确定性确定特定代码行是否将在运行时使用,更不用说整个单元。这些工具已经实现了自己的解析器来完成这项技术,但它们并非万无一失。

无论如何,清理uses子句的主要好处是从源代码和代码完成功能中消除视觉上的混乱。编译期间确实会获得一些性能增益,某些IDE后台操作也会略微加快速度,但如果您认为IDE会奇迹般地加速,您可能会感到失望。

通过以下方式可以看到更好的IDE和编译器性能:

  1. 将项目分成可以独立处理的较小部分。
  2. 消除重复代码。
  3. 禁用不需要的IDE软件包。

我当然不是在劝阻您删除未使用的单元引用。正如我所说,它将有助于减少源代码中的混乱。只需确保出于正确的原因执行此操作。


1
我使用了CnWizards,但它倾向于删除太多的内容。 - Arioch 'The
我们已经通过专门设计的工具完成了这项任务 - IDE 的速度提高了数倍。编译过程也快了约5倍。(但我不能在另一个项目中使用这个工具。) - Dmitry

13
我们有一个实用工具叫做Delphi单元依赖扫描器(DUDS)。它会扫描您的整个项目并构建一个完全可搜索的单元和依赖关系树。在查找未使用的单元方面非常有用。
该应用程序是免费软件,您可以在这里找到它here
免责声明-我是作者。

非常有用!谢谢! - Nix

4

不要认为我想要一个自动删除Uses部分中不必要单元的工具...

但是有一些工具可以识别它们...看看Icarus...这是一个免费软件,您可以在http://www.peganza.com/downloads.htm上获取。


听起来很有趣,虽然描述说,ICARUS解析Delphi或Borland Pascal源代码并生成Uses报告。所以它并不像要求的那样自动化。 - TLama
@TLama,有些情况下自动删除“未使用”的单元可能会破坏程序。想象一下一个注册了派生类但在其他地方没有直接使用的单元。作为Peganzas Pascal Analyzer(Icarus是其中的一部分)的长期忠实用户,我很高兴没有自动删除功能。 - Uwe Raabe
@Uwe,我知道风险,但是CnWizard的“Uses Cleaner”提供了一个像这样的对话框,您可以选择要从使用列表中删除的文件并进行操作。它不是完全自动化的。由您选择和删除哪些文件。有了Icarus的报告,您将不得不手动完成所有工作,这很烦人(并且违反了在此问题中提出的“如何自动删除未使用的单元”的规定)。 - TLama
1
@TLAMA同意这是手动的...我之前没有使用过Cleaner...但熟悉ICARUS...所以那就是我的回答/评论 ;) - House of Dexter
很不幸,ICARUS 实际上不能识别使用从句中未使用的单元。我已经在数百个已知未使用的单元所引用的使用从句相关项目中运行过它,但是没有一个被检测到。 - EKW

4

CnPack有一个名为“使用Cleaner…”的选项,我已经在单元测试基础上使用它而没有任何问题。它还能够处理整个项目——但由于项目大小的原因,我还没有尝试过。


我使用CnWizards - 但对于复杂项目它倾向于删除太多。 - Arioch 'The
1
提醒一下,执行工作的进程会泄漏内存,所以除非您使用的是柏林或更高版本,否则它可能会在一段时间后遇到内存问题(特别是如果您使用ProjectGroups,这似乎会泄漏内存-这是我的理解)。 - Nicholas Ring

0
使用自Delphi XE以来提供的reFind.exe实用程序,使用以下命令:
reFind *.pas /X:unuse.txt
而unuse.txt是一个文本文件,其中包含类似以下内容的内容:
#unuse Unit1
#unuse Unit2
#unuse Unit3

就是这样。它将删除使用语句中的单元,注意如果该单元是最后一个使用的单元,并且在该单元之后有分号。


嗨,Miguel,你有没有意识到你回答的问题已经在2013年被问过了?而且已经有很多好的答案了吗?最后,看一下这个链接:http://docwiki.embarcadero.com/RADStudio/Sydney/en/ReFind.exe,_the_Search_and_Replace_Utility_Using_Perl_RegEx_Expressions 我不认为你的答案是正确的。也许我错了? - fpiette
这不是一个答案,但对于我从未听说过的目的来说仍然是一个有用的工具。 - Molochnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接