Как я могу заставить MSBuild скопировать все файлы, помеченные как Контент, в папку, сохранив структуру папок? - PullRequest
8 голосов
/ 04 октября 2011

Как часть моей сборки решения, я хочу скопировать все файлы «Содержимое» (asp? X и т. Д.) В другую папку. Поскольку они так четко помечены в проекте, я подумал, что должен быть простой способ скопировать их, вместо того, чтобы написать свой собственный шаг после сборки с помощью xcopy. К сожалению, я не смог понять это - эта штука с msbuild несовместима с моим мозгом. Я просто хочу такой шаг но не могу понять синтаксис для использования.

Предложения по синтаксису Bat-файла не будут ответом на этот вопрос - применяются только чистые решения msbuild

Спасибо, Per

Ответы [ 3 ]

10 голосов
/ 05 октября 2011

Вы можете легко сделать это следующим образом:

<PropertyGroup>
  <DestFolder>..\Copy\</DestFolder>
</PropertyGroup>

<Target Name="CopyContentFiles">
  <Copy SourceFiles="@(Content)"
        DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/>
</Target>

Если вы хотите выполнить это как шаги после сборки, то вы можете просто добавить AfterTargets = "Build", например:

<PropertyGroup>
  <DestFolder>..\Copy\</DestFolder>
</PropertyGroup>

<Target Name="CopyContentFiles" AfterTargets="Build">
  <Copy SourceFiles="@(Content)"
        DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/>
</Target>
1 голос
/ 04 октября 2011

Я использую функцию веб-развертывания для упаковки всех файлов контента, а затем я могу использовать веб-развертывание для синхронизации с сайтом или использовать xcopy или, скорее, RoboCopy, если веб-развертывание не является вариантом.

Задача RoboCopy включена в Задачи сообщества MSBuild .

<PropertyGroup>
    <Configuration>Release</Configuration>
    <PackageDir>$(MSBuildProjectDirectory)\obj\$(Configuration)\Package\PackageTmp</PackageDir>
    <ServerPath>\\server\path</ServerPath>
    <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\...</MSBuildCommunityTasksPath>
</PropertyGroup>    

<ItemGroup>
    <Project Include="WebApplication.csproj"/>
</ItemGroup>

<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />

<Target Name="Deploy">
    <MSBuild Projects="@(Project)" Targets="Build;Package" Properties="Configuration=$(Configuration)"/>
    <RoboCopy
        SourceFolder="@(PackageDir)"
        DestinationFolder="$(ServerPath)"
        Subdirectories="true"
        Mirror="true"
        />
</Target>
0 голосов
/ 22 ноября 2013

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

<PropertyGroup>
  <DestFolder>..\Copy\</DestFolder>
</PropertyGroup>

<Target Name="CopyContentFiles">
  <Copy SourceFiles="@(Content)"
        DestinationFiles="$(DestFolder)\%(RecursiveDir)"/>
</Target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...