有中定义的源目录和目标目录的列表。我需要一个任务/目标来按照定义的项目组属性执行自动复制。
<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>
答案 0 :(得分: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的约定,代表目录的所有属性/元数据都应包含斜杠。
答案 1 :(得分: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