1

私はTFSビルドでタスクをより一般的にしようとしてきましたが、私がやろうとしていることの1つは、タスクを使用するビルドに応じて、いくつかのファイルを別のディレクトリにコピーすることです。プロパティを使用するというアイデアをいじくりまわしましたが、それをきれいに行う方法が思いつかなかったため、同じターゲットファイル内の別の場所で使用できたため、アイテムのメタデータを使用してみました。現在取り組んでいますが、今回だけプロパティを使用したいと思います。

これが私がやりたいことです:

<ItemGroup>
  <DestinationParent Include="$(DeploymentPath)">
    <DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
  </DestinationParent>
</ItemGroup>

そして、ビルドの後半で、アイテムのメタデータを参照して、いくつかのファイルを宛先フォルダーにコピーしようとしました。

<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy-&gt;'%(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)が空の文字列に展開されました。

4

1 に答える 1

1

編集: これはルート ノード Project の下で定義されますが、DestinationParentPath を持つ ItemGroup は Target ノードの下で定義されます。これも違いますか?

はい、違いがあります。Target 内で ItemGroup を定義する機能は、msbuild 3.5 の新機能です。宣言型のように見えますが、実際には、古いスタイルの CreateItem / CreateProperty タスクを呼び出したかのように、実行時に実行されます。それだけで潜在的な問題が発生します。含まれているタスクが (最初に) 呼び出されるタイミングを考慮する必要があります。 操作の順序は、肉眼で常に明らかであるとは限りません。「論理的な」依存関係がない場合でも、 %(DestinationParentPath) を使用するタスクを、それが作成されたタスクに依存させることが賢明な場合があります。

さらに、古くからある msbuild スコープの癖/バグがあります。 動的に作成されたプロパティとアイテムは、「兄弟」タスクには表示されません。また、ネストされたビルドで更新されたアイテムが常にバブルアップするとは限りません

リンクの回避策を確認してください。たとえ厄介であっても、自分に合ったものを見つけることができるはずです。

于 2009-09-11T00:45:07.507 に答える