Как сгенерировать MsBuild itemList из другого списка элементов на основе имени каталога текущего элемента? - PullRequest
1 голос
/ 15 сентября 2010

Я беру список файлов *.config и копирую их в список каталогов. Каталоги относятся к пути C:\branches\, имеют имя и имя. UnitTest.

так, чтобы копия выглядела следующим образом без рефакторинга / пакетирования:

<Target Name="CopyClientConfigs">

<ItemGroup>
    <ClientConfigDestinations Include="$(LocalSourcePath)\Module1\Module1.UnitTest\;
    $(LocalSourcePath)\Module2\Module2.UnitTest\;
    $(LocalSourcePath)\CommonControls\Module3\Module3.UnitTest\;
    $(LocalSourcePath)\Administration\Module4\Module4.UnitTest\;
    $(LocalSourcePath)\IndividualControls\Configuration\Module5\Module5.UnitTest\" />
    <ClientConfigs
    Include="$(ClientConfigPath)\*.config"
    Exclude="$(ClientConfigPath)\P*.config" >
    </ClientConfigs>
</ItemGroup>
<Copy
        SourceFiles="@(ClientConfigs)"
        DestinationFolder="%(ClientConfigDestinations.FullPath)"
        />

Я хочу иметь возможность использовать эту группу товаров

<ItemGroup>
<MyModules Include="$(LocalSourcePath)\Module1;
    $(LocalSourcePath)\Module2;
    $(LocalSourcePath)\CommonControls\Module3;
    $(LocalSourcePath)\Administration\Module4;
    $(LocalSourcePath)\IndividualControls\Configuration\Module5"
/>          

Так что задача будет выглядеть как

Copy
        SourceFiles="@(ClientConfigs)"
        DestinationFolder="%(ClientConfigDestinations.FullPath)\*.UnitTest\"
        />

Или лучше

Copy
        SourceFiles="@(ClientConfigs)"
        DestinationFolder="%(ClientConfigDestinations.FullPath)\%(ClientConfigDestinations.NameOnly).UnitTest\"
        />

Как мне выполнить рефакторинг или правильно пакетировать эту операцию?

Ответы [ 2 ]

9 голосов
/ 15 сентября 2010

Если я правильно прочитал ваш вопрос, я думаю , что вы пытаетесь сделать перекрестную копию продукта: скопировать все элементы в одной ItemGroup во все папки в другой группе.

На самом деле у меня есть аккуратная цель, которую я использую для этого, потому что я ненавижу то, как TeamBuild помещает все двоичные файлы в одну папку - я хочу, чтобы проекты могли указывать, что их выходные данные являются "комплектом"и что вывод также будет скопирован в одно или несколько мест.

Для этого у меня есть две группы элементов: BundleFiles (это набор файлов, которые я хочу скопировать) и BundleFolders, которые представляют собой наборпапки, в которые я хочу скопировать.

<ItemGroup>
    <BundleOutDir Include="FirstFolder;SecondFolder" />
    <BundleFiles Include="file1;file2" />
</ItemGroup>

Моя цель тогда содержит две задачи, подобные этой:

<ItemGroup>
    <FilesByDirsCrossProduct Include="@(BundleFiles)">
        <BundleOutDir>%(BundleOutDir.FullPath)</BundleOutDir>
    </FilesByDirsCrossProduct>
</ItemGroup>

Это создает группу элементов убер, содержащую перекрестный продукт файлов по папкам.

В этом случае копия довольно проста:

<Copy SourceFiles="@(FilesByDirsCrossProduct)"
    DestinationFiles="@(FilesByDirsCrossProduct -> '%(BundleOutDir)\%(Filename)%(Extension)' ) "
    SkipUnchangedFiles="true" />

Затем эти файлы копируются в папку, указанную в их метаданных.

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

1 голос
/ 15 сентября 2010
<Target Name="CopyClientConfigsBatched" Outputs="%(MyModules.FullPath)">
    <Message Text="@(MyModules -> '%(FullPath)\%(FileName).UnitTest')"/>
  <ItemGroup>
    <ClientConfigs
    Include="$(ClientConfigPath)\*.config"
    Exclude="$(ClientConfigPath)\P*.config" >
    </ClientConfigs>
  </ItemGroup>
  <Copy SourceFiles="@(ClientConfigs)" DestinationFolder="@(MyModules -> '%(FullPath)\%(FileName).UnitTest')"
     SkipUnchangedFiles="true"/>
</Target>

целевое пакетирование, кажется, сделало это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...