【问题标题】:MSBuild copy files to directory path with wildcardMSBuild 使用通配符将文件复制到目录路径
【发布时间】:2014-09-02 03:31:19
【问题描述】:

我有一个要复制到“\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)" />

任何帮助将不胜感激。

另见

Creating a list of Folders in an ItemGroup using MSBuild

【问题讨论】:

    标签: c# msbuild


    【解决方案1】:

    您构建文件不起作用,因为 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)" /> 
    

    【讨论】:

    • 这很好,但是我的目标目录没有任何文件,因此它们不会被包含在内。有其他选择吗?
    • RE:“这适用于空目录” - 我仔细检查了一个包含文件的目标目录和一个空目录:它只适用于有文件的目录。我会错过什么吗? RE:“建议明确指定一组文件夹” - 不幸的是,这将引入手动工作,因为我将在未来添加具有该结构的新文件夹。
    • 抱歉,打错字了。 “这不适用于空目录”。我已经更新了答案。
    • 至于“手动工作”,我更喜欢这种方式,因为构建过程对于输出文件夹中的任何内容都应该是确定性的。
    • 好的,谢谢,我添加了指向您提到的其他线程的链接。
    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多