プロパティを使用してアイテムのメタデータを設定する
-
05-07-2019 - |
質問
TFSビルドでタスクをより汎用的にしようとしていますが、タスクを使用するビルドに応じて、いくつかのファイルを異なるディレクトリにコピーしています。プロパティを使用するというアイデアをいじりましたが、それをきれいに行う方法を考えることができなかったので、同じターゲットファイルの別の場所で行うことができたので、アイテムメタデータの使用を試みました私が取り組んでいるのは、今回だけ、プロパティを使用したいです。
私がやりたいことは次のとおりです。
<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)を使用すると正しい値、つまり、次のようにテストが得られたことです。
EDIT:これはProjectルートノードの下で定義されますが、DestinationParentPathを持つItemGroupはTargetノードの下で定義されます。これも違いをもたらしますか?
<ItemGroup>
<ConfigurationToBuild Include="Test|Any CPU">
<FlavorToBuild>Test</FlavorToBuild>
<PlatformToBuild>Any CPU</PlatformToBuild>
</ConfigurationToBuild>
</ItemGroup>
「テスト|任意のCPU」と確信しているため、アイテムのメタデータ内の文字列のみに関心がある場合、Include属性は関連しているようには見えません。実際のファイルを参照しません。
では、なぜ%(DestinationParentPath)が空の文字列に展開されるのですか?
編集:DestinationParentPathの実際のパスもハードコーディングしようとしたことを忘れていましたが、それでも%(DestinationParentPath)が空の文字列に拡張されることになりました。
解決
EDIT:これはProjectルートノードの下で定義されますが、DestinationParentPathを持つItemGroupはTargetノードの下で定義されます。これも違いをもたらしますか?
はい、違いがあります。ターゲット内でItemGroupを定義する機能は、msbuild 3.5の新機能です。宣言的に見えますが、実際には、古いスタイルのCreateItem / CreatePropertyタスクを呼び出したかのように、実行時に実行されます。それだけで潜在的な問題が発生します:含まれるタスクが(最初に)呼び出されるタイミングを考慮する必要があります。 操作の順序は、裸に常に明らかではない目。 %(DestinationParentPath)を使用するタスクを、「論理」がなくても、作成先のタスクに依存させるのが賢明かもしれません。依存関係。
さらに、古くからあるmsbuildスコープの癖/バグがあります。 動的に作成されたプロパティ&amp;アイテムは「兄弟」には表示されません。タスク。また、ネストで更新されたアイテムビルドが常にバブルアップするわけではありません。
リンクの回避策を確認してください。たとえそれがうるさい場合でも、あなたに合った何かを見つけることができるはずです。