MSBuild CopyTask: копирование одного и того же файла в несколько мест - PullRequest
1 голос
/ 08 января 2010

Есть ли способ заставить CopyTask скопировать один и тот же файл в несколько мест?

например. Я создал файл AssemblyInfo.cs и хочу скопировать его во все мои проекты перед сборкой.

Ответы [ 3 ]

2 голосов
/ 08 января 2010

Хорошо, ну, может быть, мне следует попытаться сделать то, что я хочу сделать, прежде чем просить о помощи:)

    <ItemGroup>
        <AssemblyInfoSource 
            Include="AssemblyInfo.cs;AssemblyInfo.cs" />
        <AssemblyInfoDestination
            Include="$(Destination1)\AssemblyInfo.cs;$(Destination2)\AssemblyInfo.cs" />
    </ItemGroup>

    <Copy SourceFiles="@(AssemblyInfoSource)" DestinationFiles="@(AssemblyInfoDestination)" />
2 голосов
/ 08 января 2010

Ознакомьтесь с задачей сборки RoboCopy, которая является частью библиотеки задач по созданию сообщества, которую вы можете найти здесь . RoboCopy может копировать один исходный файл в несколько мест назначения.

Примечание: почему бы вам не использовать один файл AssemblyInfo на уровне решения и ссылаться на него в своих проектах, если вам нужна одинаковая информация в каждом проекте? Проверьте мой принятый ответ на этот вопрос: Автоматическое управление номером версии сборки в VS2008

1 голос
/ 16 мая 2012

Мне нужно было скопировать содержимое каталога в несколько мест, это то, что я придумал, это работает. Поэтому я публикую это здесь, если кто-то еще нуждается в подобном и сталкивается с этим вопросом, как я.

<!-- Create a list of the objects in PublishURL so it will copy to multiple directories -->
<ItemGroup>
    <PublishUrls Include="$(PublishUrl)"/>
</ItemGroup>
<PropertyGroup>
   <Files>$(OutputPath)\**\*</Files>
</PropertyGroup>

<!-- CopyNewFiles will copy all the files in $(OutputPath) to all the directories in the
     in $(PublishUrl). $(PublishUrl) can be a single directory, or a list of directories
     separated by a semicolon     -->
<Target Name ="CopyNewFiles">

    <!-- Get list of all files in the output directory; Cross product this with all 
    the output directories. -->
    <CreateItem Include ="$(Files)"
        AdditionalMetadata="RootDirectory=%(PublishUrls.FullPath)">
      <Output ItemName ="OutputFiles" TaskParameter ="Include"/>
    </CreateItem>

    <Message Text="'@(OutputFiles)' -> '%(RootDirectory)\%(RecursiveDir)'"/>

    <Copy  SourceFiles="@(OutputFiles)"
           DestinationFolder ="%(RootDirectory)\%(RecursiveDir)"/>
</Target>

Если вы хотите скопировать AssemblyInfo.cs в папки A и B, вы должны установить свойство Files="AssemblyInfo.cs" и PublishUrls="A;B"

Что делает эту работу дополнительными метаданными в задаче CreateItem AdditionalMetadata="RootDirectory=%(PublishUrls.FullPath)", поэтому для каждого файла, найденного в File, создается 1 запись для каждого элемента, найденного в PublishUrls. В вашем случае одного файла эквивалентным в написании XML будет:

<ItemGroup>
    <OutputFiles Include="AssemblyInfo.cs">
        <RootDirectory>A</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="AssemblyInfo.cs">
        <RootDirectory>B</RootDirectory>
    </OutputFiles>
</ItemGroup>

Теперь, если вы скопировали содержимое папки с файлами 1.txt и 2.txt, скопированными в A и B, эквивалентный xml будет:

<ItemGroup>
    <OutputFiles Include="1.txt">
        <RootDirectory>A</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="2.txt">
        <RootDirectory>A</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="1.txt">
        <RootDirectory>B</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="2.txt">
        <RootDirectory>B</RootDirectory>
    </OutputFiles>
</ItemGroup>
...