作为包含许多项目的解决方案的一部分,我有一个引用的项目(通过<ProjectReference>
解决方案中的其他三个项目,以及其他一些项目)。在 中AfterBuild
,我需要将 3 个特定依赖项目的输出复制到另一个位置。
通过各种 SO 答案等,我决定完成的方式是:
<MSBuild
Projects="@(ProjectReference)"
Targets="Build"
BuildInParallel="true"
Condition="'%(Name)'=='ProjectA' OR '%(Name)'=='ProjectB' OR '%(Name)'=='ProjectC'">
<Output TaskParameter="TargetOutputs" ItemName="DependentAssemblies" />
</MSBuild>
<Copy SourceFiles="@(DependentAssemblies)" DestinationFolder="XX" SkipUnchangedFiles="true" />
但是,我遇到了这个问题。该<MSBuild
步骤的IncrementalClean
任务最终删除了ProjectC
. 在 VS2008 下运行此程序时,如果项目包含此目标,则如果我在整个解决方案上进行构建,则将build.force
文件存放在 ProjectC 的obj/Debug
文件夹中,然后触发 ProjectC 重新构建AfterBuild
,而如果从构建中排除此项目,则 [正确] 不会触发 ProjectC 的重建(关键是 ProjectC 的所有依赖项的重建)。在这种情况下,这可能是特定于 VS 的诡计,不会在 TeamBuild 或其他命令行 MSBuild 调用的上下文中发生(但最常见的用法是通过 VS,因此我需要以任何一种方式解决此问题)
依赖项目(以及一般的解决方案的其余部分)都是用 VS 交互创建的,因此ProjectRefence
s 包含相对路径等。我已经看到提到这可能会导致问题 - 但没有完整解释原因,或者何时修复或如何解决它。换句话说,我对例如ProjectReference
通过手动编辑.csproj 将路径转换为绝对路径并不感兴趣。
虽然完全有可能我在做一些愚蠢的事情,并且有人会立即指出它是什么(这会很棒),但请放心,我已经花了很多时间研究/v:diag
输出等(尽管我没有尝试从从头开始 - 这是在相对复杂的整体构建的背景下)