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

バッチ処理の組み合わせによっては、異なる ItemGroup で機能するものとそうでないものがあるため、これらのバッチ処理は非常に紛らわしいものです。いくつかの違いを示すために小さなプロジェクトを作成します。

<?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>
  • 最初のものは、文字列セミコロンで区切られたすべてのアイテムの後に配置されます。
  • 2 つ目は、1 つのアイテムの特定のメタデータを使用して、その文字列を作成します。これはすべての要素に対して行われ、1 つの項目としてセミコロンで区切られます。
  • 3 番目の式もアイテムのメタデータを参照していますが、グループ内の各アイテムのターゲットも呼び出しています。そのようにすると、ItemGroup を混在させることができなくなります。

    (で) myFile.txt;myFile2.txt を使用 -- myFile3.txt

    使用 -> c:\Temp\somethingInbetween\myFile.txt;c:\Tmp\somethingInbetween\myFile2.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

OK、実際には何とか解決しましたが、「ボーナス」の質問に答えることにまだ興味があります/おそらく私の解決策は良くありません:

ターゲット内にa を追加し、PropertyGroupそこにパスを連結しました。

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

そして後で私が使用したそのターゲットで

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

代わりに、これにより、パーセントが (おそらく) 2 つの異なる場所から来るという問題が回避されました。

于 2013-05-14T11:16:48.930 に答える