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