最终,我们希望使用命令行复制csproj
标记为Content
的所有文件,同时保留目录结构,而不编辑原始csprog
文件
我们已经看到How can I get MSBuild to copy all files marked as Content to a folder, preserving folder structure?这对我们不起作用,因为它涉及编辑csproj
文件。我们希望避免这样做。
我们已经考虑过通过命令行使用msbuild
,但我们不知道如何要求它 等效于此:
<Target Name="CopyContentFiles">
<Copy SourceFiles="@(Content)"
DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/>
</Target>
换句话说,我们希望在命令行中使用命令行来定义目标(而不仅仅是指定一个)。例如。在伪代码中我们想要这个:
msbuild MyApp.csproj /t:"Copy SourceFiles="@(Content)" DestinationFiles=..."
我们还考虑过使用xcopy
但我们还没有确定如何让它只复制csproj
标记为Content
的文件。
答案 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;
}