不编辑csproj文件,让MSBuild将标记为内容的所有文件复制到文件夹,保留文件夹结构?

问题

最终,我们想用命令行复制一个csproj已标记为Content,同时保留目录结构中的所有文件,而无需编辑的原始csprog文件。不编辑csproj文件,让MSBuild将标记为内容的所有文件复制到文件夹,保留文件夹结构?

我们已经见过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的文件。

回答:

我使用PowerShell。

如果你有一个脚本获取-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:下面的片段假设您想要在当前工作目录中重新创建目录树):

.\Get-VSProjectItems.ps1 ..\SomeProject\SomeProject.csproj | % { 

[void](mkdir $_.Directory -ErrorAction:SilentlyContinue);

copy-item $_.fullname $_.relpath;

}

以上是 不编辑csproj文件,让MSBuild将标记为内容的所有文件复制到文件夹,保留文件夹结构? 的全部内容, 来源链接: utcz.com/qa/259113.html

回到顶部