MSBuildのリスト項目の注意点

リスト項目ではまりました...
何ではまったかと言うとリスト項目のワイルドカードが展開されるタイミングです。

例えば下記のようなリスト項目。

<ItemGroup>
  <TestFiles 
	Include="C:\TestFiles\**\*.*" 
	Exclude="" />
</ItemGroup>

実際にMSBuildで実行した際には、プロジェクトファイルが「読み込まれた時点」でのファイルパスで展開されるようです。つまり上記の例だとあらかじめC:\TestFiles\フォルダ内に3つのファイルがあれば、リスト項目は3つの要素で展開されます。

じゃあ、プロジェクトファイルが読み込まれた時点でそれらのファイルが存在しなければ?
その場合、リスト項目は空になってしまいます。

何が問題かというとプロジェクトファイルの中で、動的にファイルを作成したりコピーしたりしてもそれらはリスト項目としては認識されないという点です。例えば、VSSから最新ソースを取得し、コンパイルし、作成されたアセンブリを...なんてことをやろうとするとうまく動いてくれないことがあります。
これに気づかずにはまってしまいました。。。

解決策は、リスト項目の定義とリスト項目を使用するターゲットを別のプロジェクトファイルとして定義し、元のビルドファイルから必要なところでタスクを利用して呼び出してやることです。こうすることで必要な時点でリスト項目が展開されるようになります。こんな感じで。

<Target Name="PackagingAllFiles">
  <MSBuild 
	Projects="ZipFiles.proj"
   />
</Target>

もうひとつの問題は、リスト項目内のワイルドカードを外部から指定できないという点です。
これは小井土さんのブログで紹介されています。そちらを参考にしてみてください。

http://www.ailight.jp/blog/koido/archive/2006/08/13/11873.aspx