我有两个项目的解决方案。其中一个是一个简单的项目,不依赖于任何特殊的程序集来构建。但是,允许应用程序启动外部可执行文件(我也拥有 - 这是我的解决方案的第二个项目)。当我构建项目时,我希望将外部项目的可执行文件(例如app.config的+依赖项)复制到项目的目标目录下。
如何使用MsBuild实现这一目标?我的第一个想法是添加对可执行文件的引用(即使我不需要它来构建)来复制文件。这对我来说似乎有些苛刻。
谢谢!
P.S。另一个问题:假设我可以告诉MsBuild复制可执行文件。如果不构建可执行文件怎么办?我可以强迫它构建吗?
答案 0 :(得分:3)
在您的情况下,您应该让您的MSBuild脚本替换您的解决方案并在那里声明所需的依赖项:
<Project DefaultTargets="Executable_A">
<Target Name="Executable_A" DependsOnTargets="Executable_B">
<MSBuild Projects="Executable_A.proj" Targets="Build" />
</Target>
<Target Name="Executable_B">
<MSBuild Projects="Executable_B.proj" Targets="Build">
<Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" />
</MSBuild>
<Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="C:\My_Target_Path\" SkipUnchangedFiles="true" />
</Target>
</Project>
...您可以指示第二个项目的目标将其输出复制到所需位置。您甚至可以指示您的第一个项目将其输出路径存储到变量中,以便在复制第二个项目(DestinationFolder)的输出时使用。
答案 1 :(得分:1)
您是否查看了MSBuild复制任务:Copy Task?
答案 2 :(得分:0)
如果您对@Filburt的回答感到满意,我建议您改进此解决方案。
如果您要了解默认构建目标的工作原理:
<Target
Name="Build"
Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
DependsOnTargets="$(BuildDependsOn)"
Returns="$(TargetPath)" />
您会看到构建或重建目标中的唯一输出是 $(TargetPath)。 $(TargetPath)是构建程序集的完整路径。要更改此行为,您可以破解构建过程。但是在项目 B :
中定义自己的目标会更简单<Target
Name="BuildWithConfig"
DependsOnTargets="Clean;Build"
Returns="$(TargetPath);$(TargetPath).config" />
在 A 项目中,只需定义 AfterBuild 目标:
<Target Name="AfterBuild">
<MSBuild Projects="Executable_B.proj" Targets="BuildWithConfig">
<Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" />
</MSBuild>
<Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="$(OutDir)\SubDirForB" SkipUnchangedFiles="true" />
</Target>
此解决方案不需要创建自定义构建脚本。您将直接在VS中获得结果。