基本上我想做一些预防性维护。我想防止某些第 3 方库被包含在某个项目中作为参考。有什么方法可以指定项目禁止哪些引用?
编辑:我会稍微澄清一下目的。我要保护的项目是一个类库,我希望它具有来自一组非常特定的 3rd 方库的功能。该类库在其他解决方案中用于通用数据访问功能,因此如果引用了这些第 3 方库,则也需要它们。目的是使该项目只是一个数据访问库并保持“包”的轻量级。
EDIT2:不知道为什么反对票。是出于对这种事情是否可以做的兴趣的问题。
尽管投了反对票,但我认为这是一个合理的问题。我在一个大型开发团队中工作,所有人都在使用相同的软件,并且有类似的问题。
我们在具有许多不同有界上下文的大型领域驱动设计架构中工作,并且不希望人们在上下文之间添加引用。我们有指导方针、标准、架构文档、代码审查等,很多东西都阻止了添加 IRL 的引用(正如有人所说)。然而,我们有两个相对较新的初学者,他们对当前结构没有太多经验,只是不神奇地知道一切。他们碰巧检查了彼此的代码,瞧,添加了不需要的引用。
在试图防止错误发生并确保遵守标准方面,我看不出任何严厉的做法。只是预防措施。这不也是我们编写单元测试的部分原因吗?这样可以让未来的其他一些新人意识到他们在不知不觉中破坏了某些东西?
我不是特别喜欢分析项目文件以获取参考。我们可能会处理它的方式是定义一组单元测试,这些测试在每个被测项目的程序集引用中爬行,并在它们识别出不应该存在的引用时失败。显然,这只有在您进行持续集成/部署(包括运行单元测试)时才有效。
因此,即使新人在没有先在本地运行单元测试(并意识到他们的错误)的情况下签入了一些东西,我们明亮的红色闪烁构建状态灯或构建服务器电子邮件很快就会告诉团队中的每个人出了什么问题。
您可以使用Visual Studio 层图来实现这一点(假设您拥有 Visual Studio Ultimate)。绘制一个代表您的项目的框/层,然后将您的项目放到它上面以链接它们,绘制一个代表禁止组件的框/层,然后将这些组件放到它上面以链接它们,然后您就完成了(通过不在层,您向 VS 指示不允许依赖项)。
现在通过设置 MSBuild 属性在项目和/或 TFS 构建中打开层图验证:ValidateArchitecture=True
这绝对是一个有效的问题,Ben 的回答几乎一针见血。但是,此工具可以帮助自动执行参考约束:
搜索允许的程序集并标记异常可能更实用,因为有人可以简单地将流氓程序集重命名为不在您列表中的名称并逃脱检测。
用于构建程序集的 .csproj 文件是一个普通的 XML 文件,因此可以使用 XPath 语句轻松定位引用的程序集,其中谓词是允许的程序集名称。您可以设置一个触发器,只要将 .csproj 文件签入到源存储库,就会扫描该文件并标记任何罪魁祸首程序集。
使用这种方法或任何类似的方法,都会带来您邀请流氓开发人员玩跳蛙游戏的风险。而且你很可能会输掉那场比赛,因为开发人员是出色的跳跃式玩家。因此,更稳健的方法是减少对技术的依赖,而更多地依赖管理资源计划。
为Roslyn 编译器编写扩展,检查所有规则,并将此分析器放入解决方案中。您的分析将成为编译的一部分。
这与 NsDepCop 的基本工作方式非常相似。