我们的产品有大约15个解决方案,每个解决方案都有多个项目。
问题很简单:哪种工具可以让我们在整个代码库中搜索死代码?
在一个解决方案中搜索是很容易的(SO上有很多答案)。
但是,如何确定解决方案AlphaSol的项目AlphaProj中的"public void Foo()"(未在AlphaSol内部使用)是否真的在例如BetaSol中使用?
尽管您有15个解决方案,但没有什么能阻止您创建另一个引用所有项目的解决方案,比如all.sln。因此,每当您需要查找外部引用时,您都可以打开这个all.sln解决方案并查找引用。
我们可能有大约100个解决方案,还有一个All.sln引用了这些解决方案中的所有项目。将一个解决方案中的所有项目添加到all.sln很容易:只需选择Add Existing Projects
并从这15个解决方案文件中选择一个即可。您需要在Add Existing Projects
对话框中调整文件类型才能选择解决方案文件。此外,为了保持这个大型解决方案的有序性,您可以使用解决方案文件夹。
您可能还想签出NDepend。
由于另一个答案足够安静,可以满足您的即时需求,而且我不想听起来像一个糟糕的广告,所以我把它留给感兴趣的读者来了解更多关于该工具的信息。
要详细说明Christian的答案,工具NDepend确实可以帮助在.NET代码库中查找未使用的代码免责声明:我是这个工具的开发者之一
NDepend提出编写基于LINQ查询的代码规则(CQLinq)。提出了大约200个默认代码规则,其中3个专门用于未使用/死代码检测:
- 潜在的死类型(因此检测未使用的类、结构、接口、委托…)
- 潜在死方法(因此检测未使用的方法、ctor、属性getter/setter…)
- 潜在死区
NDepend集成在Visual Studio中,因此可以在IDE中检查/浏览/编辑这些规则。该工具还可以集成到CI流程中,它可以生成报告,显示违反的规则和罪魁祸首代码元素。
如果你点击上面的3个链接来获取这些规则的源代码,你会发现关于类型和方法的链接有点复杂。这是因为它们不仅检测未使用的类型和方法,而且还检测未使用死类型和方法(递归)仅使用的类型和方法。
这是静态分析,因此规则名称中的前缀可能。如果通过反射仅使用代码元素,则这些规则可能会将其视为未使用,但事实并非如此。
除了使用这3条规则之外,我还建议通过测试来衡量代码覆盖率,并努力实现完全覆盖。通常,您会看到测试无法覆盖的代码实际上是可以安全丢弃的未使用/已死亡的代码。这在复杂的算法中尤其有用,因为在复杂算法中,不清楚代码分支是否可访问。