2

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

  <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 参数,有人知道我做错了什么吗?

4

6 回答 6

5

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

<Target Name="AfterCompile">
    <ItemGroup>
        <FilesToCopy Include="$(SolutionRoot)\Development_VS2008\MyCompanyName.SharePoint.12\**\*.*"/>
    </ItemGroup>

    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="c:\testing\%(RecursiveDir)"/>
</Target>
于 2009-01-16T10:07:17.753 回答
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 文件 - 卸载此项目并选择“Edit YourProjectName.csproj”选项(在卸载的项目上单击鼠标右键)。编辑并保存 .csproj 文件,然后重新加载项目。

于 2018-09-24T07:19:16.820 回答
1

你需要这样的东西:

<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 复制任务。

于 2009-01-16T11:05:44.360 回答
0

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

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

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

于 2009-01-16T10:27:00.613 回答
0

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

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

于 2011-10-25T11:15:04.243 回答
0

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

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

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

于 2013-08-06T16:52:59.227 回答