-1

在 中定义了源目录和目标目录的列表。我需要一个任务/目标来根据定义的项目组属性执行 robocopy。

<ItemGroup>
<ItemToCopy Include="$(RootPath)\Audi">
    <WhereToCopy>$(FinalFolder)\Audi</WhereToCopy>
    <WhatToCopy>*.svc</WhatToCopy>
</ItemToCopy>
<ItemToCopy Include="$(RootPath)\Custom">
    <WhereToCopy>$(FinalFolder)\Custom</WhereToCopy>
    <WhatToCopy>*.svc</WhatToCopy>
</ItemToCopy>
<ItemToCopy Include="$(RootPath)\Audi\bin">
    <WhereToCopy>$(FinalFolder)\Audi\bin</WhereToCopy>
    <WhatToCopy>*.*</WhatToCopy>
</ItemToCopy>
<ItemToCopy Include="$(RootPath)\Custom\bin">
    <WhereToCopy>$(FinalFolder)\Custom\bin</WhereToCopy>
    <WhatToCopy>*.*</WhatToCopy>
</ItemToCopy>

我尝试了以下代码,期望对部署文件夹中的每个项目执行复制操作。

<Target Name="CopyAll">  
   <RoboCopy  
        Source="@(ItemToCopy)"  
        Destination="%(ItemToCopy.WhereToCopy)" Files="ItemtoCopy.Whattocopy"/>  
</Target>

此外,如果我们看到项目 1 和 2(还有 3 和 4),它们在将类似类型的文件从它们的 %ItemName 复制到具有子目录 %ItemName 的相同路径的意义上是相同的。如果我们也能避免这种额外的代码气味,那就太好了。希望像下面这样的工作:

<ItemToCopy Include="$(RootPath)\@PublishProjects">
        <WhereToCopy>$(FinalFolder)\@PublishProjects</WhereToCopy>
        <WhatToCopy>*.svc</WhatToCopy>
    </ItemToCopy>
where,
<ItemGroup>
    <PublishProjects Include="Audi" />
    <PublishProjects Include="Custom" />
  </ItemGroup>
4

2 回答 2

0

你不能混合@和%。这两个都表示对项目组的操作。使用 % 对项目组中的每个项目执行一次操作。@对整个项目组执行一次操作。请注意,并非所有任务都支持项目组。

如果您使用@,那么您正在使用具有时髦语法的“转换”。 https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-transforms

此外,项目组旨在为您匹配文件。指定文件夹确实有效,它指的是文件夹,但 msbuild 的优势之一是为您查找文件。

代替

<ItemToCopy Include="$(RootPath)\Audi">
    <WhereToCopy>$(FinalFolder)\Audi</WhereToCopy>
    <WhatToCopy>*.svc</WhatToCopy>
</ItemToCopy>

我会去

<ItemToCopy Include="$(RootPath)Audi\*.svc">
    <TargetSubDir>Audi\</TargetSubDir>
</ItemToCopy>

那么你的目标会更像

  <Target Name="CopyFiles">
    <Copy Condition="@(ItemToCopy)!=''"
          SourceFiles="@(ItemToCopy)"
          DestinationFiles="@(ItemToCopy->'$(FinalFolder)%(TargetSubDir)%(RecursiveDir)%(Filename)%(Extension)')"
          OverwriteReadOnlyFiles="true"
          SkipUnchangedFiles="true" />
  </Target>

请记住,代表目录的所有属性/元数据都包含尾部斜杠是 msbuild 约定。

于 2018-12-01T18:18:25.030 回答
0

好的,我给出的答案跳过了 robocopy 的使用,我承认这是您问题的特定部分。

@ 和 % 仍然适用(您不能混合使用它们),这主要是您在 CopyAll 目标中出错的地方。

<Target Name="CopyAll">  
   <RoboCopy  
        Source="@(ItemToCopy)"  
        Destination="@(ItemToCopy->'%(WhereToCopy)')" Files="@(ItemtoCopy->'%(Whattocopy)')"/>  
</Target>

查看有关转换的帮助,以更好地了解如何使用它们 https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-transforms

于 2018-12-01T18:23:12.167 回答