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