1

以下是我发现的其他一些类似答案,但没有一个回答我的问题:

使用 afterbuild 任务将整个项目结构复制到另一个目录

使用 msbuild 复制所有文件和文件夹

MSbuild 复制整个文件夹

我正在尝试做的事情:

我需要在编译时将目录树复制到项目中的几个不同位置。以下是目前的完成方式:

  <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)')"/>

这假装运行,但根本不复制任何内容。我也尝试过使用%(DeployLabel.Dir),但这给了我一个错误。

我不想使用xcopy,因为该程序似乎不在 Windows 安装的默认清单中(我的 PC 没有它)。另外,我必须承认,我并不完全明白他们的%所作所为。当我一开始看到 @ 和 % 时,我以为它们是从 Make 复制而来的,但现在我开始怀疑......还有一些关于什么手段的洞察力->会有所帮助(很难找到关于这些神秘名称的文档)。

4

2 回答 2

1

这些批处理非常令人困惑,因为某些批处理组合与不同的 ItemGroups 一起使用,而有些则不是。我创建了一个小项目来显示一些差异:

<?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>
  • 第一个只会将所有后面的项目放在字符串分号分隔的地方。
  • 第二个将使用一个项目的特定元数据来制作它的字符串。这是对所有元素完成的,它们以分号分隔为一个项目。
  • 第三个表达式也是引用项目的元数据,但它也调用组中每个项目的目标。这样做你不能混合 ItemGroups。

    使用 (at) myFile.txt;myFile2.txt -- myFile3.txt

    使用 -> c:\Temp\somethingInbetween\myFile.txt;c:\Tmp\somethingInbetween\myFi le2.txt -- c:\diff\somethingInbetween\myFile3.txt

    使用百分比 c:\Temp\myFile.txt -- \

    使用百分比 c:\Tmp\myFile2.txt -- \

    使用百分比 \ -- c:\diff\myFile3.txt

于 2013-05-14T13:08:19.577 回答
1

好的,我实际上以某种方式解决了它,但我仍然有兴趣回答“奖励”问题/也许我的解决方案不好:

PropertyGroup在目标内部添加了一个并在那里连接了路径:

<PropertyGroup>
  <Deploydir>$(ProjectDir)deploy\%(DeployLabel.Dir)\media</Deploydir>
</PropertyGroup>

后来在我使用的那个目标中

DestinationFiles="@(MediaFiles->'$(Deploydir)\%(RecursiveDir)%(Filename)%(Extension)')"

相反,因此这避免了百分比(可能)来自两个不同地方的问题。

于 2013-05-14T11:16:48.930 回答