首页 > 解决方案 > MSBuild 传递 ProjectReference 的内容未复制以构建单元测试项目的输出

问题描述

我有以下(简化的)解决方案结构:

ProjectA
|- Content: myexe.exe with CopyIfNewer

ProjectB
|- ProjRef: ProjectA

ProjectC
|- ProjRef: ProjectB

当我运行 ProjectC 的构建时,也构建了 ProjectA(例如,因为 ProjectA 不是最新的,或者因为我单击了“全部重建”),然后 myexe.exe 被放入 ProjectC 的 bin 输出文件夹中。但是,在任何其他情况下,myexe.exe 不在 ProjectC 的 bin 输出文件夹中。

这是一个已知问题吗?难道我做错了什么?如何解决这个问题?

标签: msbuildvisual-studio-2019

解决方案


但是,在任何其他情况下,myexe.exe 不在 ProjectC 的 bin 输出文件夹中。这是一个已知问题吗?难道我做错了什么?如何解决这个问题?

测试

首先,我猜测第一个项目是一个.net框架项目,甚至三个项目都是基于框架的。在我这边,我创建了这样的三个项目,并引用了你提到的三个项目的关系。确切地说,当我修改项目C的代码(A和B之前已经构建)时,文件无法按照你的意愿复制到项目C中。但是当我只有两个项目 A,B(B 项目参考:A)时,它总是将第一个项目 A 的文件复制到 B(每当我选择 Copy always 或 Copy if newer or build or rebuild the project B)。此外,我测试了三个基于 Net Core 或 .Net Standard 的项目都没有问题。

结论

所以指出这个问题的原因是中间项目项目 B没有构建(<strong>up-to-date Skips the build ),所以无法将项目 A 的文件复制到项目 C 作为中转站。(特别是对于非sdk框架项目)。我认为这是 Visual Studio 中项目参考中的一个功能或问题。或者您可以将其报告给DC 论坛以获得详细说明。

解决方案

您可以将此类属性添加到项目 B 的 csproj 文件中,以打破最新检查并确保始终构建它。您可以在 Debug 或 Release 中在 PropertyGroup 下添加此节点

 <DisableFastUpToDateCheck> true </DisableFastUpToDateCheck>

希望它可以帮助你。


推荐阅读