2010-01-08 4 views
1

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

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

+1

Почему вы хотите скопировать тот же файл AssemblyInfo по всем вашим проектам? Не можете ли вы использовать ссылку на один файл? –

+1

О, конечно! Спасибо –

+0

Проверьте редактирование моего ответа ... и не забудьте принять, если вам это нравится;) –

ответ

2

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

На стороне примечания: почему вы не используете один файл AssemblyInfo на уровне решения и не ссылаетесь на него в своих проектах, если вам нужна одна и та же информация в каждом проекте? Проверьте мой принято отвечать на этот вопрос: Automatic assembly version number management in VS2008

+0

Является ли версия, упакованная с MSI в задачи сборки сообщества, не последней? Не вижу задачу RoboCopy после ее установки ... (это даже не в документации или проекте образца) –

+0

hmm странно, это в списке на сайте, хотя –

2

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

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

    <Copy SourceFiles="@(AssemblyInfoSource)" DestinationFiles="@(AssemblyInfoDestination)" /> 
+0

Спасибо за обмен. Количество исходных и целевых файлов должно быть одинаковым? –

+0

Да, количество файлов должно соответствовать. Я предполагаю, что вы, если хотите, переименуете файлы назначения. http://msdn.microsoft.com/en-us/library/3e54c37h.aspx (Хотя я определенно думаю, что связанная опция AssemblyInfo - это лучшее, что можно сделать здесь, спасибо за это :) это просто для полноты) –

1

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

<!-- 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. В вашем случае одного файла, equivelent в выписывая XML будет:

Теперь, если вы скопировали содержимое папки, которые были файлы 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>