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

时间:2008-11-05 21:58:15

标签: msbuild msbuild-task

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

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

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

我的业务层引用了我的Dal.Interface项目。我的Web项目有一个对Business层的引用,并且就目前而言,执行构建会将业务层和Dal.Interface项目拉入输出。到现在为止还挺好。现在,为了运行Web应用程序,它需要Dal实现。我不想在任何地方引用实现,因为我想对接口强制执行编码而没有引用意味着它不会出现在intellisense等中。

所以我想我可以通过MSBuild复制操作作为AfterBuild任务来处理这个问题(我在构建Web项目时构建了Dal实现设置,但没有引用)。我不想在MSBuild参数中硬编码路径或其他任何东西,所以我试图弄清楚如何从Web应用程序项目的MSBuild文件中引用Dal项目的输出。

所以基于上面提到的项目,这就是我想要发生的事情:

  1. 启动网络应用程序构建
  2. 构建所有必需的项目(已配置,因此已完成)
  3. MSBuild“AfterBuild”任务启动,项目C(Dal实施)的输出被复制到项目A的Bin目录(Web应用程序)
  4. 第3部分是我被困的地方。

    我确信这可以做到,我只是找不到帮助的好参考。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

我已经做了这个工作,虽然我很想找到一个更清洁的解决方案,它可以在MSBuild中获得内置参数的优势(比如$(TargetDir)等)但是要指向我想要获取输出的项目)。无论如何,这就是我所做的:

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

我希望看到一个更清洁的解决方案,但现在应该这样做。

答案 1 :(得分:0)

所以,你想要一个引用,但不能在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>