MSBuild无法使用Copy任务递归地复制文件

3

我知道之前已经有人问过类似的问题(见Recursively copy all files with MSBuildMSBuild recursive copy),但是我似乎无法使它在我的项目文件中正常工作。

我正在使用Visual Studio 2015,所以我不知道是否有任何变化。我也尝试遵循此页面上的第二个示例,但结果相同:https://msdn.microsoft.com/en-us/library/3e54c37h.aspx

我正在尝试从我的源目录递归地复制文件到我的inetpub目录。我在“BuildLocal”目标内设置了以下内容:

<ItemGroup>
  <CopyFiles Include="**\*.cshtml" />
</ItemGroup>
<Copy SourceFiles="@(CopyFiles)" DestinationFiles="@(CopyFiles->'$(DeploymentFolder)\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="true" SkipUnchangedFiles="true" />

在我的PropertyGroup中,DeploymentFolder变量被设置为:

<DeploymentFolder>C:\inetpub\websites\TestSite</DeploymentFolder>

我收到的错误信息是:

warning MSB3021: Unable to copy file "**\*.cshtml" to "C:\inetpub\websites\TestSite\**\*.cshtml". Illegal characters in path.

将CopyFile Include更改为include="$(ProjectDir)**\*.cshtml"也没有任何效果...

对于这个问题的任何帮助都将非常棒 :)


你是否尝试过相对于目录指定源文件,而不是依赖于当前工作目录,这几乎总是一个坏主意?类似于 <CopyFiles Include="$(MyProjectDir)\**\*.cshtml" /> 这样的东西。 - stijn
我无法复现它(实际上,我已经使用这种复制方式很多次),但我这里没有VS2015。确实非常奇怪,没有展开。这里显示的代码是你正在使用的精确副本,对吗? - stijn
是的,这就是从 .csproj 文件中复制出来的确切标记。我需要引用某些目标或其他东西才能使用复制命令吗? 我正在考虑在后期构建操作中使用类似 xcopy 的东西使其工作 :( - Juzzbott
不,你不需要导入任何特殊的东西,复制任务是内置的。我今天尝试了一下,在VS2015中也无法重现,所以可能是你这边出了问题。很难说是什么问题...你能否使用Copy而不带任何通配符?你的文件是否是正确的UTF-8或ASCII格式?你能否只使用一个通配符而不是递归地使用Copy?或者先尝试只使用DestinationFolder而不是DestinationFiles等。 - stijn
你得到的错误表明问题出在项目定义上,而不是Copy任务上。如果将<ItemGroup>移动到当前所在的<Target>之外,行为是否会改变?这将强制在任何构建发生之前评估通配符。 - Rainer Sigwald
显示剩余2条评论
1个回答

2
我怀疑项目目录下有一个完整路径超过 260 个字符(MAX_PATH)的文件。如果是这种情况,你将会遇到MSBuild bug, 导致通配符被包含为文本而不是文件列表。这在node_modules文件夹中经常出现。
从Visual Studio 2017开始(实际上是通过其预览5预发布版),为包含长路径的文件夹添加一个Exclude属性将获取其余的文件而不是文字**\*.cshtml
要解决此问题,可以使用Exec任务来调用robocopy或类似工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接