私はTFSビルドでタスクをより一般的にしようとしてきましたが、私がやろうとしていることの1つは、タスクを使用するビルドに応じて、いくつかのファイルを別のディレクトリにコピーすることです。プロパティを使用するというアイデアをいじくりまわしましたが、それをきれいに行う方法が思いつかなかったため、同じターゲットファイル内の別の場所で使用できたため、アイテムのメタデータを使用してみました。現在取り組んでいますが、今回だけプロパティを使用したいと思います。
これが私がやりたいことです:
<ItemGroup>
<DestinationParent Include="$(DeploymentPath)">
<DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
</DestinationParent>
</ItemGroup>
そして、ビルドの後半で、アイテムのメタデータを参照して、いくつかのファイルを宛先フォルダーにコピーしようとしました。
<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy->'%(DestinationParentPath)\Destination\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" ></Copy>
残念ながら、ビルドの実行後、BuildLogには次のように表示されます。
Copying file from "$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\<File being copied>" to "\Destination\<File being copied>".
%(DestinationParentPath)は、何らかの理由で空の文字列に展開されていました。%(DestinationParent.DestinationParentPath)を使用するとエラーが発生し、単に%(DestinationParentPath)を使用する必要があることを通知します。$(DeploymentPath)は、ビルドの他のいくつかの場所で期待されるように、正しい文字列に展開されます。
もう1つの混乱の原因は、%(ConfigurationToBuild.FlavorToBuild)を使用すると、次のように正しい値、つまりTestが生成されたことです。
編集:これはルートノードプロジェクトの下で定義されますが、DestinationParentPathを持つItemGroupはターゲットノードの下で定義されます。これも違いがありますか?
<ItemGroup>
<ConfigurationToBuild Include="Test|Any CPU">
<FlavorToBuild>Test</FlavorToBuild>
<PlatformToBuild>Any CPU</PlatformToBuild>
</ConfigurationToBuild>
</ItemGroup>
「Test|AnyCPU」は実際のファイルを参照していないと確信しているため、アイテムのメタデータ内の文字列のみに関心がある場合は、Include属性が関連しているようには見えません。
では、もう一度、%(DestinationParentPath)が空の文字列に展開されるのはなぜですか?
編集:DestinationParentPathの実際のパスもハードコーディングしようとしたことを忘れましたが、それでも%(DestinationParentPath)が空の文字列に展開されました。