2010-12-14 69 views
0

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

我如何用MsBuild实现这个功能?我的第一个想法是添加对可执行文件的引用(即使我不需要它来构建)来复制文件。这对我来说似乎有点不好意思。

谢谢!

P.S.另一个问题:假设我可以告诉MsBuild复制可执行文件。如果可执行文件没有编译会怎么样?我可以强制它建立?

回答

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)的输出时使用的变量中。

+0

Eh Filburt,我刚刚尝试了这个解决方案,这正是我所期待的!但是,不会复制Executable_B的app.config(和其他依赖项)。任何想法为什么? – Martin 2010-12-15 01:38:19

+0

@Martin呵呵......老实说,我得自己看看。 TargetOutputs只抓取项目本身实际构建的内容。你也可能想要省略SkipUnchangedFiles。只要找到正确的输出参数,我就会更新我的答案。 – Filburt 2010-12-15 07:33:35

+0

我还没有找到解决方案。任何想法? – Martin 2010-12-22 03:23:07

0

如果您对@Filburt回答满意,我可以建议改进此解决方案。

如果默认构建目标是如何工作的,你会看一看:

<Target 
    Name="Build" 
    Condition=" '$(_InvalidConfigurationWarning)' != 'true' " 
    DependsOnTargets="$(BuildDependsOn)" 
    Returns="$(TargetPath)" /> 

你会看到,从生成唯一的输出或重建目标$(TARGETPATH)。 $(TargetPath)是构建程序集的完整路径。要改变这种行为,你可以破解构建过程。但是,这将是搭配简单定义自己的目标项目

<Target 
    Name="BuildWithConfig" 
    DependsOnTargets="Clean;Build" 
    Returns="$(TargetPath);$(TargetPath).config" /> 

一个项目只是定义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中得到结果。