【问题标题】:Copy files with MsBuild使用 MsBuild 复制文件
【发布时间】:2010-12-14 16:33:45
【问题描述】:

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

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

谢谢!

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

【问题讨论】:

    标签: .net msbuild msbuild-task


    【解决方案1】:

    在您的情况下,您应该让您的 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) 的输出时使用。

    【讨论】:

    • Eh Filburt,我刚刚尝试了这个解决方案,这正是我正在寻找的!但是,不会复制 Executable_B 的 app.config(和其他依赖项)。知道为什么吗?
    • @Martin 呵呵......老实说,我必须自己看看这个。 TargetOutputs 只抓取项目本身实际构建的内容。此外,您可能希望省略 SkipUnchangedFiles。找到正确的输出参数后,我会立即更新答案。
    • 我还没有找到解决方案。有什么想法吗?
    【解决方案2】:

    您是否查看过 MSBuild 复制任务:Copy Task

    【讨论】:

      【解决方案3】:

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

      如果您看一下默认 Build 目标的工作原理:

       <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中得到结果。

      【讨论】:

        猜你喜欢
        • 2014-09-14
        • 2011-09-25
        • 2011-08-18
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        相关资源
        最近更新 更多