作为包含许多项目的解决方案的一部分,我有一个引用的项目(通过<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" />
Run Code Online (Sandbox Code Playgroud)
但是,我遇到了这个问题.该<MSBuild步骤的IncrementalClean任务最终删除了一些输出ProjectC.在VS2008下运行时,如果项目包含此目标,如果我对整个解决方案进行构建,那么build.force存放在obj/DebugProjectC文件夹中的文件将触发ProjectC重建AfterBuild,如果从构建中排除此项目,则[正确] ]不会触发ProjectC的重建(并且重要的是重建ProjectC的所有家属).在这种情况下,这可能是VS特定的技巧,这不会发生在TeamBuild或其他命令行MSBuild调用的上下文中(但最常见的用法是通过VS,所以我需要解决这个问题)
依赖项目(以及一般的解决方案的其余部分)都是与VS交互式创建的,因此ProjectRefences包含相对路径等.我已经看到提到这可能会导致问题 - 但没有完整解释为什么,或者它将被修复或如何解决它.换句话说,我真的不感兴趣,例如ProjectReference通过手动编辑.csproj 将路径转换为绝对路径.
虽然我完全有可能做一些愚蠢的事情,有人会立即指出它是什么(这将是伟大的),请放心,我花了很多时间仔细考虑/v:diag输出等(虽然我没有尝试建立一个repro从从头开始 - 这是在相对复杂的整体构建的背景下)
我有一个包含许多类库的解决方案,以及一个引用这些程序集的ASP .NET网站。
当我从IDE中构建解决方案时,网站引用的所有程序集都位于bin目录中。大!
当我从命令行使用MsBuild时,所有引用的程序集都不会复制到bin目录中。为什么?
我的命令行很简单:
msbuild.exe d:\myproject\mysolution.sln
Run Code Online (Sandbox Code Playgroud)