【问题标题】:Check binary references in a solution检查解决方案中的二进制引用
【发布时间】:2014-12-12 08:43:13
【问题描述】:

我正在寻找一种方法来检测大型 Visual Studio 解决方案中的程序集引用问题:

  • 对错误位置的二进制引用,例如不在源代码管理或其他项目输出中的路径
  • 解决方案中跨项目对同一程序集的多个版本的二进制引用
  • 没有路径的二进制引用,可能会被重定向到 GAC
  • 应该是项目引用的二进制引用

整个故事

我从事一个大型 C# 项目,其中有将近 200 个项目。 随着时间的推移,问题之一是添加了对程序集的引用,但并不总是添加到相同的版本或正确的位置。

例如,项目可能会在没有提示路径的情况下获得对 System.Web.Mvc 的引用,从而使其引用 GAC 中的任何版本。 Visual Studio(和 Resharper)也将提供添加缺失的引用,但可以通过添加对另一个项目的输出文件夹的引用来实现。

现在最近的Windows Update catastrophy 让一些团队成员陷入困境,无法构建解决方案。可以想象,这提高了我们对程序集引用管理的优先级。

为了检测一些最明显的问题,我已经设置了一个 msbuild 文件,该文件可以包含在每个 csproj 文件中,并且可以检测错误的引用。

但是,需要手动编辑新项目文件以包含该脚本。所以这将不可避免地被遗忘。

我真正想要的是在持续构建期间检查解决方案中的所有项目文件是否存在“错误”引用,以便始终检查所有项目。

我一直在谷歌上搜索这样的解决方案,发现了很多静态分析和代码分析工具,但没有什么可以分析解决方案中的项目文件。

那么,在我离开roll my own 解决方案之前,有没有办法做到这一点?

更新

为了清理代码库,我创建了一些 ScriptCS 代码,这些代码将扫描所有 csproj 文件以查找 Nuget 包中程序集的引用并修复它们。起来了on GitHub

【问题讨论】:

  • 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • @EZI 我要求为具体的软件开发问题提供具体的解决方案,我想说这符合 StackOverflow 的主题
  • 我们遇到了一个相关的问题。随着时间的推移,我们的解决方案最终会得到同一个 NuGet 包的两个或三个版本,因为人们只会安装最新的包,而不是使用现有版本。 Anywho...我最终编写了自己的工具来分析包并识别任何重复项。我怀疑你将不得不做同样的事情。

标签: c# msbuild code-analysis static-analysis


【解决方案1】:

您可以创建一个 NuGet 包,其唯一目的是将自定义 .targets 文件合并到项目中。我最近使用此策略解决了另一个问题(缺少 .snk 文件的错误消息)。

如果您创建类似的包,则可以轻松右键单击您的解决方案节点并验证它是否已安装在您的所有 C# 项目中。

如果您的分析更复杂,并且除了 .targets 文件之外还需要使用程序集(自定义构建任务),您可以使用我用于 Antlr4 NuGet 的方法包,其中包含构建任务、资源和自定义 .props.targets 文件,但没有安装它的项目引用的实际程序集。

【讨论】:

    【解决方案2】:

    与其将它添加到解决方案中的所有项目,不如创建某种测试(单元测试、构建文件等),它可以将项目文件作为输入、解析它,如果 OE 或更多则抛出错误参考文献不正确。比向项目文件添加(和签出、提交等)自定义构建步骤要容易得多。

    即使您将使用之前建议的 nuget 包,您仍然需要手动检查您的所有项目(200 个项目?真的吗?)是否引用了该包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2022-11-01
      • 2013-02-02
      • 2021-02-04
      相关资源
      最近更新 更多