【问题标题】:How to remove unused units from all source files on Delphi XE2?如何从 Delphi XE2 上的所有源文件中删除未使用的单元?
【发布时间】:2013-07-22 19:04:28
【问题描述】:

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

附:之后 IDE 会运行得更快。

【问题讨论】:

  • 问题更准确。请取消“暂停”标志。这个问题对于 Delphi 上的每个大型项目都非常重要,答案对所有开发人员都非常有用。
  • 您能否准确定义“未使用单位”的含义。请注意,带有初始化代码的单元可能会对您的程序产生影响,即使您没有引用它们的导出符号。
  • 自动移除单位并不像你想象的那么简单。一些单元有初始化部分,可能会做一些需要的事情(例如,调用CoInitialize 来设置COM),即使单元中似乎没有其他任何东西被调用。 (是的,我知道您可以自己手动调用CoInitialize;关键是您不能总是自动告诉该单元可能在做什么。)

标签: delphi ide delphi-xe2


【解决方案1】:

没有办法完全自动化。

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

  • CnPack Uses Units Cleaner
  • Peganza 的 Pascal 分析器(它是伙伴 icarus)。
  • Lazarus IDE 的 CodeTools 包中有一个“未使用的单元”对话框。

Peganza 的工具只是显示一个报告。 CnPack 将提示您删除未使用的单元,但您必须确认。 Lazarus 会为您提供它认为未使用的单位列表,并让您选择删除部分或全部。

为什么不自动化?

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

在任何情况下,清理uses 子句的主要好处是消除源代码本身和代码完成功能的视觉混乱。是的,在编译过程中获得了一些性能,并且某些 IDE 后台操作会稍微加快,但如果您认为 IDE 会奇迹般地加快速度,我认为您会感到失望。

您将通过以下方式获得更好的 IDE 和编译器性能:

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

我当然不是想劝你不要删除未使用的单元引用。正如我所说,这将有助于整理您的来源。只要确保您这样做是出于正确的原因。

【讨论】:

  • 我使用了 CnWizards - 但它往往会删除太多
  • 我们已经通过专门设计的工具完成了这项工作 - IDE 速度提高了数倍。编译过程 - 大约 5 次。 (但我不能将此工具用于其他项目。)
【解决方案2】:

我们有一个名为Delphi Unit Dependency Scanner (DUDS) 的实用程序。它扫描您的整个项目并构建一个完全可搜索的单元和依赖关系树。它对于查找未使用的单位非常有用。

该应用程序是免费软件,您可以在here找到它。

免责声明-我是作者。

【讨论】:

  • 非常有用!谢谢!
【解决方案3】:

不要以为我会想要一个可以自动删除“使用”部分中不必要的单元的工具...

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

【讨论】:

  • 听起来很有趣,尽管正如the description 所说,ICARUS 会解析 Delphi 或 Borland Pascal 源代码并生成使用报告。 所以它不像所要求的那样自动化。跨度>
  • @TLama,在某些情况下,自动删除“未使用”单元可能会破坏程序。想象一个单元,它注册了一个没有其他地方直接使用的派生类。作为 Peganzas Pascal Analyzer(Icarus 是其中的一部分)的长期和快乐用户,我很高兴没有自动删除。
  • @Uwe,我知道风险,但 CnWizard 的 Uses Cleaner 为您提供了 dialog like this,您可以在其中选择要从使用列表中删除的文件并继续操作。它不是完全自动化的。您可以选择和删除谁的文件。使用来自 Icarus 的报告,您必须手动完成所有工作,这很烦人(并且反对 如何自动删除未使用的单位,正如在这个问题中提出的那样)。
  • @TLAMA 同意它是手动的……而且我没有使用过 Cleaner……但对 ICARUS 很熟悉……所以这就是我的回答/评论;)
  • 不幸的是,ICARUS 实际上并没有在 using 子句中识别未使用的单元。我已经针对具有数百个由 usings 引用的已知未使用单元的项目运行它,并且检测到其中零个。
【解决方案4】:

CnPack 有“使用清洁剂...”选项,我已经逐个单元地使用了,没有问题。它还具有完成整个项目的能力——由于项目的规模,我没有尝试过。

【讨论】:

  • 我使用了 CnWizards - 但对于复杂的项目,它往往会删除太多。
  • 只是提醒。执行工作的过程会泄漏内存,因此除非您在柏林或更好的地方,否则它可能会在一段时间后遇到内存问题(特别是如果您使用 ProjectGroups,这似乎会泄漏内存 - 我的解释)。
【解决方案5】:

使用自 Delphi XE 以来提供的 reFind.exe 实用程序,使用此命令

重新查找 *.pas /X:unuse.txt

unuse.txt 是一个文本文件,内容如下:

#unuse Unit1
#unuse Unit2
#unuse Unit3

就是这样。如果该单元是最后一个使用的并且有一个 ; ,它将删除uses 子句中的单元。在单位之后。

【讨论】:

  • 嗨 Miguel,您是否意识到您回答的问题已在 2013 年提出?并且已经有许多好的答案?最后,请阅读以下内容:docwiki.embarcadero.com/RADStudio/Sydney/en/… 我认为您的回答无效。也许我错了?
猜你喜欢
  • 1970-01-01
  • 2021-04-22
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多