Пакетное копирование списка элементов с помощью MSBuild Task RoboCopy - PullRequest
0 голосов
/ 30 ноября 2018

Существует список каталогов источника и назначения, определенных в.Мне нужна одна задача / цель для выполнения робокопии в соответствии с определенными свойствами группы элементов.

<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>

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Хорошо, этот ответ, который я дал, пропускает использование 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

0 голосов
/ 01 декабря 2018

Нельзя смешивать @ и%.Оба из них указывают на операцию над группой товаров.Использование% выполняет операцию один раз для каждого элемента в группе элементов.@ выполняет операцию один раз для всей группы товаров.Обратите внимание, что не все задачи поддерживают группы элементов.

Если вы используете @, тогда вы используете «преобразование», которое имеет необычный синтаксис.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 о том, что все свойства / метаданные, представляющие каталог, включают в себя завершающий слеш.

...