在不编辑csproj文件的情况下,让MSBuild将标记为Content的所有文件复制到文件夹中,保留文件夹结构?

时间:2015-06-01 15:11:00

标签: cmd msbuild csproj

问题

最终,我们希望使用命令行复制csproj标记为Content的所有文件,同时保留目录结构,而不编辑原始csprog文件

我们已经看到How can I get MSBuild to copy all files marked as Content to a folder, preserving folder structure?这对我们不起作用,因为它涉及编辑csproj文件。我们希望避免这样做。

的MSBuild?

我们已经考虑过通过命令行使用msbuild,但我们不知道如何要求它 等效于此:

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

换句话说,我们希望在命令行中使用命令行来定义目标(而不仅仅是指定一个)。例如。在伪代码中我们想要这个:

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

的XCopy?

我们还考虑过使用xcopy但我们还没有确定如何让它只复制csproj标记为Content的文件。

1 个答案:

答案 0 :(得分: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;
        }
    }

然后复制内容文件变得非常简单,只需将输出传递给创建目标文件夹结构的脚本块并复制文件(下面的nb:fragment假定您要在当前工作目录中重新创建目录树):

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