9

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

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

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

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

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

所以基于上面提到的项目,这是我希望看到的:

  1. Web 应用程序构建开始
  2. 所有必需的项目构建(已经配置,所以完成)
  3. MSBuild“AfterBuild”任务启动,项目 C(Dal 实现)的输出被复制到项目 A(Web 应用程序)的 Bin 目录

第 3 部分是我卡住的地方。

我确信这是可以做到的,我只是没有找到一个很好的参考来帮助。提前感谢您的帮助。

4

2 回答 2

9

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

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

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

于 2008-11-05T22:24:11.787 回答
2

所以,你想有一个参考,但在 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>
于 2014-01-27T09:52:01.880 回答