不编辑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