Не редактируя файл csproj, заставить MSBuild копировать все файлы, помеченные как Content, в папку, сохраняя структуру папок?

Вопрос

В конечном счете, мы хотели бы использовать командную строку для копирования всех файлов, помеченных csproj как Content, с сохранением структуры каталогов и без редактирования исходного файла csprog.

Мы видели Как заставить MSBuild копировать все файлы, помеченные как Content, в папку с сохранением структуры папок? Это не работает для нас, поскольку требует редактирования файла csproj. Мы хотим избежать этого.

MSBuild?

Мы думали об использовании msbuild через командную строку, но не знаем, как заставить его сделать просто эквивалент этого:

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

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

msbuild MyApp.csproj /t:"Copy SourceFiles="@(Content)" DestinationFiles=..."

XКопировать?

Мы также думали об использовании xcopy, хотя мы не определили, как заставить его копировать только те файлы, которые csproj помечает как Content.


person Shaun Luttin    schedule 01.06.2015    source источник


Ответы (1)


Я использую PowerShell.

Если у вас есть такой скрипт Get-VSProjectItems.ps1:

param(
    [Parameter(Mandatory=$true)] $project
)

$ErrorActionPreference = 'stop';
$project = (resolve-path $project).Path;
$projectDir = Split-Path $project -Parent;
$ns = @{
    msb = 'http://schemas.microsoft.com/developer/msbuild/2003';
}

Select-Xml -Path:$project -XPath:'//msb:Content' -Namespace:$ns |
    Select-Object -ExpandProperty:Node | 
    % {
        New-Object psobject -Property:@{
            RelPath = $_.Include;
            Directory = (Split-Path -Parent $_.Include);
            FullName = Join-Path $projectDir $_.Include;
        }
    }

Затем копирование файлов содержимого становится таким же простым, как передача вывода в блок сценария, который создает структуру целевой папки и копирует файл (примечание: фрагмент ниже предполагает, что вы хотите воссоздать дерево каталогов в текущем рабочем каталоге):

.\Get-VSProjectItems.ps1 ..\SomeProject\SomeProject.csproj | % { 
    [void](mkdir $_.Directory -ErrorAction:SilentlyContinue); 
    copy-item $_.fullname $_.relpath;
}
person piers7    schedule 25.02.2016