【问题标题】:Team Build, copy file target issueTeam Build,复制文件目标问题
【发布时间】:2018-09-27 11:49:46
【问题描述】:

我有这个团队在编译后构建目标设置

  <Target Name="AfterCompile">
    <Copy SourceFiles="$(SolutionRoot)\Development_VS2008\MyCompanyName.SharePoint.12" DestinationFolder="c:\testing"></Copy>
  </Target>

我想要将文件夹结构从源复制到目标...

奇怪的是我收到了这个错误

无法复制文件“C:\TFS\NightlyBuild\Sources\Development_VS2008\MyCompanyName.SharePoint.12\” 到目标文件“c:\testing\”,因为目标是文件夹而不是文件。 要将源文件复制到文件夹中,请考虑使用 DestinationFolder 参数而不是 DestinationFiles。

如您所见,我确实使用了destinationfolder 参数,有人知道我做错了什么吗?

【问题讨论】:

    标签: tfs copy tfsbuild targets


    【解决方案1】:

    我认为这可能只是因为SourceFiles 是一个目录而不是您要复制的文件。试试这个:

    <Target Name="AfterCompile">
        <ItemGroup>
            <FilesToCopy Include="$(SolutionRoot)\Development_VS2008\MyCompanyName.SharePoint.12\**\*.*"/>
        </ItemGroup>
    
        <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="c:\testing\%(RecursiveDir)"/>
    </Target>
    

    【讨论】:

    • 这有点工作,至少它没有失败,但它没有保留目标文件夹中的目录结构,知道如何将结构保留在另一边吗?
    • +1 在迄今为止的所有其他解决方案中,这个更优雅简洁,它解决了我的复制问题。它确实将文件及其文件夹复制到子目录中。谢谢肯特!
    【解决方案2】:

    这个错误不是在 Team Foundation 项目下发生的,而是在独立项目下发生的,当我使用构建操作 ContentWithTargetPath 添加新的 .dll 文件时。我希望这个库包含在我的输出目录中。此操作的记录出现在 .csproj 文件的 ItemGroup 部分之一中,例如:

    <ContentWithTargetPath Include="Resources\Libraries\libName.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </ContentWithTargetPath>
    

    但由于某种原因,这不足以让 ContentWithTargetPath 选项正常工作(我在 StackOverflow 的某处看到了关于它的解释,但不记得在哪里)。您应该像这样手动将 TargetPath 小节添加到 ContentWithTargetPath:

    <ContentWithTargetPath Include="Resources\Libraries\libName.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>libName.dll</TargetPath>
    </ContentWithTargetPath>
    

    在 Visual Studio 中编辑 .csproj 文件时,IntelliSense 不会显示 TargetPath 子部分,并且它不会出现在 libName.dll 的属性窗口中,因此您应该手动添加此子部分。这种情况甚至出现在我的 Visual Studio Community 2017 中。

    PS。您可以在 Visual Studio 中编辑 .csproj 文件 - 卸载此项目并选择“编辑 YourProjectName.csproj”选项(在卸载的项目上单击鼠标右键)。编辑并保存 .csproj 文件,然后重新加载项目。

    【讨论】:

    • 虽然我的错误与 swagget index.html 文件有关,但这也是我的解决方案。我添加了标签&lt;TargetPath&gt;index.html&lt;/TargetPath&gt;,它起作用了。谢谢@Alex34758
    【解决方案3】:

    你需要这样的东西:

    <CreateItem Include="someFolder\**\*.*">
    
        <Output ItemName="files" TaskParameter="Include" />
    
    </CreateItem>
    
    <Copy SourceFiles="@(files)" DestinationFiles="@(files->'C:\folder\%(relativedir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
    

    或者,我发现最简单的方法(如果您想对包含/排除的内容更加严格)是使用我编写的一些自定义 MSBuild 任务:http://www.aaron-powell.com/blog.aspx?cat=AaronPowell.MSBuild.Tasks

    您提供源目录、目标方向(提供对网络共享的支持)和要排除的文件名/扩展名。

    这主要是因为 Team Build 在运行时会弄得一团糟(尤其是 Web 应用程序),而且实际上无法使用标准的 MSBuild 复制任务。

    【讨论】:

      【解决方案4】:

      我们在使用 postbuild xcopy 命令时遇到了很多问题。我们决定避免使用 xcopy 命令。

      我们现在将文件(我们要复制的)包含到项目中,并且我们将复制本地属性设置为“如果较新则复制”和目标目录(目录结构必须在项目中相同)

      帮助很大。
      也许它也适合你的情况。

      【讨论】:

      • 我需要手动将文件复制到其他位置,我正在考虑使用 xcopy,我可能会尝试这个。
      【解决方案5】:

      Copy 任务显然不支持复制目录(因为它基于 'copy'),并且 xcopy 有时会由于源中的长文件名(>256 个字符)而失败。

      我这样做了(使用 robocopy): <Exec WorkingDirectory="$(MSBuildProjectDirectory)" Command='robocopy $(MSBuildProjectDirectory)\Main $(DropLocation) /S /COPY:DATS /NP /NFL /NDL /v' ContinueOnError="true" />

      【讨论】:

        【解决方案6】:

        我收到了完全相同的信息:

        错误 103 无法将文件“obj\Release\xxxx.dll”复制到目标文件“bin\Release\xxxx.dll”,因为目标是文件夹而不是文件。要将源文件复制到文件夹中,请考虑使用 DestinationFolder 参数而不是 DestinationFiles。 xxxx

        它发生(我不知道为什么)我在发布文件夹中有另一个与程序集名称相同的文件夹(包括扩展名),因此 Visual Studio 无法在那里创建程序集。它不是项目或解决方案中的配置,所以我只是删除了该文件夹(我不知道它是如何创建的)并且它起作用了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-16
          • 1970-01-01
          • 2011-05-15
          • 1970-01-01
          • 2013-08-04
          • 1970-01-01
          • 1970-01-01
          • 2010-12-20
          相关资源
          最近更新 更多