考虑一个包含许多类库项目的解决方案。他们每个人都安装了一堆NuGet包,每个项目都有一个单元测试项目。请记住,类库项目的引用配置为Copy Local = false
,如何确保单元测试项目始终至少包含原始项目的所有引用?
我们已经有几次被这个问题所困扰了。无处不在,我们的夜间构建由于缺少dll而失败,当我们检查发生了什么时,通常有人添加了一个新的包或对项目的引用,但没有在单元测试项目中安装相同的引用。这个问题往往不会表现出来,因为在开发机器中,每个项目都会将其输出复制到一个单独的文件夹中。在TFS中构建时,会覆盖MSBuild并将所有输出放在同一文件夹中。
我们在不需要直接执行的所有内容上使用Copy Local = false
策略(即,仅将测试项目和Web应用程序配置为复制本地所有引用)。这样做是为了避免不必要的dll副本并加快构建过程。通过使用Copy Local = false
,我们需要显式添加对每个项目的所有引用,因为它们不会自动从引用的项目中复制。对于单元测试项目,这通常意味着测试项目中的packages.config
文件包含原始项目中的所有包,以及测试特定的dll,如模拟框架等。
就个人而言,我喜欢明确指定所有引用,因为这样可以让某人更容易看到正在发生的事情以及更清楚地依赖于什么。我们过去也遇到过默认Copy Local = true
的问题,所以我不太喜欢把它改回来。但有一段时间我们偶然发现了一个与没有添加所需引用的人有关的问题。
我是否可以通过某种方式强制执行此操作,以便不不能从给定项目中的依赖项目中获取所有引用?理想情况下,我希望它是一个编译错误,但任何类型的执行都是有益的。如果解决方案中的每个项目在引用彼此时都表现得像NuGet包那么会非常酷:使用NuGet包时,您始终确保所有引用都是正确的,因为依赖关系在nupkg中明确声明并添加到任何添加的项目中原包装。