使用MsBuild复制文件

时间:2010-12-14 16:33:45

标签: .net msbuild msbuild-task

我有两个项目的解决方案。其中一个是一个简单的项目,不依赖于任何特殊的程序集来构建。但是,允许应用程序启动外部可执行文件(我也拥有 - 这是我的解决方案的第二个项目)。当我构建项目时,我希望将外部项目的可执行文件(例如app.config的+依赖项)复制到项目的目标目录下。

如何使用MsBuild实现这一目标?我的第一个想法是添加对可执行文件的引用(即使我不需要它来构建)来复制文件。这对我来说似乎有些苛刻。

谢谢!

P.S。另一个问题:假设我可以告诉MsBuild复制可执行文件。如果不构建可执行文件怎么办?我可以强迫它构建吗?

3 个答案:

答案 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中获得结果。