我有一个要复制到“\ Folder1 \ DestinationDir”和“\ Folder2 \ DestinationDir”的DLL。我尝试使用野外梳理的目的地路径:
"\Folder*\DestinationDir",
但是我收到了一个错误:
No Destination specified for Copy.
这是我的XML:
<ItemGroup>
<ItemToCopy Include="$(OutDir)Mydll.dll" />
</ItemGroup>
<ItemGroup>
<DeployPath Include="$(MSBuildProjectDirectory)\Folder*\DestinationDir" />
</ItemGroup>
<MakeDir Directories="$(DeployPath)" />
<Copy SourceFiles="@(ItemToCopy)" DestinationFolder="%(DeployPath.FullPath)" />
非常感谢任何帮助。
答案 0 :(得分:5)
您构建文件不起作用,因为ItemToCopy不会扩展目录路径,它会扩展文件。
因此,如果要枚举目录,则应该定位这些目录中的现有文件,然后从文件列表中获取目录列表。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ItemToCopy Include="$(MSBuildProjectDirectory)\toCopy.txt" />
</ItemGroup>
<ItemGroup>
<DeployPath Include="$(MSBuildProjectDirectory)\Folder*\*.*" />
<DeployFolders Include="@(DeployPath->'%(RootDir)%(Directory)'->Distinct())" />
</ItemGroup>
<Target Name="Test">
<Copy SourceFiles="@(ItemToCopy)" DestinationFolder="%(DeployFolders.FullPath)" />
<Message Text="Destination folder = @(DeployFolders)" />
</Target>
</Project>
请注意,这不适用于空目录。 另一个线程讨论了这个问题 Creating a list of Folders in an ItemGroup using MSBuild
我建议明确指定一组文件夹。 例如,这可以使用项元数据完成,而不是依赖于现有的文件夹结构:
<ItemGroup>
<DeploySpecificFolders Include="$(MSBuildProjectDirectory)\toCopy.txt">
<FolderToCopyTo>Folder1</FolderToCopyTo>
</DeploySpecificFolders>
</ItemGroup>
...
<Message Text="Specific folders = %(DeploySpecificFolders.FullPath) will be copies to %(DeploySpecificFolders.FolderToCopyTo)" />
<Copy SourceFiles="@(DeploySpecificFolders)" DestinationFolder="$(MSBuildProjectDirectory)\%(DeploySpecificFolders.FolderToCopyTo)" />