MSBuild将另一个项目的输出复制到当前项目的输出中

11

我有一个情况,希望使用MSBuild将一个项目的输出汇入到目标应用程序的输出目录中,而不需要在我的MSBuild复制任务中硬编码路径。以下是场景:

  • A项目-Web应用程序项目
  • B项目-Dal接口项目
  • C项目-Dal实现项目

还有一个业务层,但与我要解决的MSBuild问题无关。

我的业务层引用了Dal.Interface项目。我的Web项目引用了Business层,并且按照现状,进行构建将会将Business层和Dal.Interface项目导入到输出中。目前为止一切顺利。现在为了使Web应用程序运行起来,它需要Dal实现。我不想在任何地方引用实现,因为我想强制执行对接口的编码,没有引用意味着它不会出现在智能提示中等等。

所以,我想通过MSBuild复制操作作为“AfterBuild”任务来处理这个问题(我已经设置了Dal Implementation以在Web项目构建时构建,只是没有引用)。我不想在MSBuild参数中硬编码路径或其他任何东西,因此我正在尝试找出如何从Web应用程序项目的MSBuild文件中引用Dal项目的输出。

所以,基于上述项目,这就是我希望看到的结果:

  1. 启动Web应用构建
  2. 所有必需的项目都在构建(已经配置,因此完成了)
  3. MSBuild“AfterBuild”任务启动,并将C项目(Dal Implementation)的输出复制到A项目(Web应用程序)的Bin目录中。

第3点是我遇到的问题。

我相信这可以做到,只是找不到一个好的参考来帮助解决。提前感谢任何帮助。

2个回答

10

我已经完成了这项工作,尽管我很想找到一种更干净的解决方案,利用MSBuild内置参数(如$(TargetDir)等)来指向我想要获取输出的项目。无论如何,以下是我所做的:

<Target Name="AfterBuild">
<Copy SourceFiles="$(SolutionDir)MyProject.Dal.Linq\bin\$(Configuration)\MyProject.Dal.Linq.dll" DestinationFolder="$(TargetDir)"/>
</Target>

我希望能看到一个更简洁的解决方案,但现在这个应该可以。


我很久以前就点赞了这个。正如你所建议的,这并不干净 - 很明显,如果OutDir更改,例如在使用TeamBuild构建时,这将会中断。(以防其他人看到此内容而没有意识到其缺陷)。另请参见https://dev59.com/J0zSa4cB1Zd3GeqPkC7f#2325620 - Ruben Bartelink
请参考https://dev59.com/J0zSa4cB1Zd3GeqPkC7f#2325620,了解解决我提到的问题的一种方法的示例。 - Ruben Bartelink

4

所以,您想要一个参考,但不希望在VS中看到它。因此,您希望在需要时构建它,并像其他Content文件一样复制到输出。以下是如何实现:

<Target Name="IncludeDALImplementation" BeforeTargets="AfterBuild">
  <MSBuild Projects="..\DalImplementation\DAL.csproj" BuildInParallel="$(BuildInParallel)" Targets="Build">
    <Output TaskParameter="TargetOutputs" ItemName="DalImplementationOutput" />
  </MSBuild>

  <ItemGroup>
    <Content Include="@(DalImplementationOutput)" />
  </ItemGroup>
</Target>

当我在Visual Studio编译时,出现了这个错误:未找到"Content"任务 - Thorarin
@Thorarin:代码已修复,抱歉。请注意,它仍未经过测试。 - Jonathan
我做了相同的更改,它起作用了。不过我需要复制依赖项以及项目本身的输出,所以我不得不稍微改变我的方法。 - Thorarin
是否可以在不实际构建的情况下获取目标输出? - Macke
可能是这样。然而,这并没有什么意义——输出文件夹只有在项目构建期间才会被创建,因此在此之前你几乎无能为力。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接