Visual studio MSBuild在路径名中使用元数据时复制整个目录
以下是我找到的几个类似的答案,但没有一个回答我的问题: 我想做的是: 我需要在编译后将目录树复制到项目中的几个不同位置。 以下是目前的做法:Visual studio MSBuild在路径名中使用元数据时复制整个目录,visual-studio,msbuild,copy,Visual Studio,Msbuild,Copy,以下是我找到的几个类似的答案,但没有一个回答我的问题: 我想做的是: 我需要在编译后将目录树复制到项目中的几个不同位置。 以下是目前的做法: <ItemGroup> <MediaFiles Include="$(ProjectDir)media\**\*.*" /> <DeployLabel Include="$(ProjectDir)deploy\x"> <Dir>x</Dir> <
<ItemGroup>
<MediaFiles Include="$(ProjectDir)media\**\*.*" />
<DeployLabel Include="$(ProjectDir)deploy\x">
<Dir>x</Dir>
</DeployLabel>
<DeployLabel Include="$(ProjectDir)deploy\y">
<Dir>y</Dir>
</DeployLabel>
<DeployLabel Include="$(ProjectDir)deploy\z">
<Dir>z</Dir>
</DeployLabel>
</ItemGroup>
<Target Name="GenericDeploy"
Inputs="@(DeployLabel)"
Outputs="%(Identity).Dummy">
<Message Text="Deploying: @(DeployLabel)" />
<Copy SourceFiles="@(MediaFiles)"
DestinationFiles="@(MediaFiles->'$(ProjectDir)deploy%(Dir)media\%(RecursiveDir)%(Filename)%(Extension)')"/>
x
Y
Z
它假装运行,但根本不复制任何内容。我还尝试使用%(DeployLabel.Dir)
,但这给了我一个错误
我不想使用
xcopy
,因为该程序似乎不在Windows安装的默认清单中(我的电脑没有)。另外,我必须承认,我不完全理解%
这件事是做什么的。当我一开始看到@和%时,我以为它们是从Make复制的,但现在我开始怀疑。。。另外,了解一下->
的含义也会有所帮助(很难找到关于这些神秘名称的文档)。好吧,我确实以某种方式解决了这个问题,但我仍然对回答“额外”问题感兴趣/也许我的解决方案不好:
我在目标中添加了一个PropertyGroup
,并在那里连接了路径:
<PropertyGroup>
<Deploydir>$(ProjectDir)deploy\%(DeployLabel.Dir)\media</Deploydir>
</PropertyGroup>
相反,这避免了百分比(可能)来自两个不同位置的问题。这些批处理非常混乱,因为批处理的某些组合适用于不同的项目组,而有些则不适用。我创建了一个小项目来显示一些差异:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Batch" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<ItemGroup>
<BatchItem Include="myFile.txt">
<Folder>c:\Temp</Folder>
</BatchItem>
<BatchItem Include="myFile2.txt">
<Folder>c:\Tmp</Folder>
</BatchItem>
<DifferentItem Include="myFile3.txt">
<Folder>c:\diff</Folder>
</DifferentItem>
</ItemGroup>
<Target Name="Batch">
<Message Text="Using (at) @(BatchItem) -- @(DifferentItem)" />
<Message Text="Using -> @(BatchItem->'%(Folder)\somethingInbetween\%(Identity)') -- @(DifferentItem->'%(Folder)\somethingInbetween\%(Identity)')" />
<Message Text="Using percent %(BatchItem.Folder)\%(BatchItem.Identity) -- %(DifferentItem.Folder)\%(DifferentItem.Identity)" />
</Target>
</Project>
c:\Temp
c:\Tmp
c:\diff
- 第一个将只在字符串分号分隔的情况下放置所有后面的项
- 第二个将使用一个项目的特定元数据来创建一个字符串。这是对所有元素执行的,它们以分号分隔为一个项目
- 第三个表达式也引用了项的元数据,但它也调用了组中每个项的目标。这样做你不能混合项目组 使用(at)myFile.txt;myFile2.txt——myFile3.txt 使用->c:\Temp\somethingbeen\myFile.txt;c:\Tmp\somethingbeen\myFi le2.txt--c:\diff\somethinginebween\myFile3.txt 使用百分比c:\Temp\myFile.txt--\ 使用百分比c:\Tmp\myFile2.txt--\ 使用百分比\--c:\diff\myFile3.txt
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Batch" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<ItemGroup>
<BatchItem Include="myFile.txt">
<Folder>c:\Temp</Folder>
</BatchItem>
<BatchItem Include="myFile2.txt">
<Folder>c:\Tmp</Folder>
</BatchItem>
<DifferentItem Include="myFile3.txt">
<Folder>c:\diff</Folder>
</DifferentItem>
</ItemGroup>
<Target Name="Batch">
<Message Text="Using (at) @(BatchItem) -- @(DifferentItem)" />
<Message Text="Using -> @(BatchItem->'%(Folder)\somethingInbetween\%(Identity)') -- @(DifferentItem->'%(Folder)\somethingInbetween\%(Identity)')" />
<Message Text="Using percent %(BatchItem.Folder)\%(BatchItem.Identity) -- %(DifferentItem.Folder)\%(DifferentItem.Identity)" />
</Target>
</Project>