update.はじめにソース生成時にたまにお世話になるBuildalyzerだが、実際に使う上でいくつか躓いた点があったので、書いておくBuildalyzerの大雑把な説明Buildalyzerは、msbuildのビルド結果からプロパティやプロジェクトアイテムを組み立てるという仕組みになっている(2.x時点)。Buildalyzer.Workspacesを使うことにより、この結果からRoslynワークスペースを作成し、アセンブリのシンボル等を取得することができる。buildの結果と一致するとは限らないという場合がある。これはMSBuildとRoslynは互いに独立する概念であり、相互変換が必要になるために起きる問題であるということを踏まえる必要がある。Roslynワークスペースへの変換クラスを見てみると、一つ一つMSBuildプロパティからRoslynプロジェクトへの変換を行っていることがわかる。このため、AllowUnsafeBlocks等の、MSBuildプロパティで指定されるコンパイルスイッチは無視される場合もある(2.1.0まではDefineConstantsも渡されていなかった)。プロジェクトでは問題はないが、一部の特殊ケースでは問題になる場合もある。以下のように、GetWorkspaceなどで変換後、コンパイルオプションを再セットする。余計なステップが走ってしまうBuildalyzerは、プロジェクト解析のため、msbuildの実行結果を解析している。そのため、ある程度のビルドが走るのは致し方ないが、時にビルド後に特殊なステップを導入していると、予期しない動作を招いてしまう場合がある。以下のようにビルドするステップを絞る。dotnetのプロジェクトシステムのドキュメントや、ビルドログ等が参考になると思う。何のタスクを最低限指定すればいいかという点に関しては、テキストログ等から解析するのもいいが、バイナリログから構造的に解析するのもいいかと思う。Cleanタスク問題さて、Buildalyzerは2.x現在cscの実行ログを元に、参照するドキュメントリストの取得を行っている。workspaceができてしまうことがある。Workspaceができてしまうことがある。}}Cleanタスク問題回避策これを回避するには、IntermediateOutputPathにテンポラリのパスを設定し、実行前後で消すという対策が考えられる。ディレクトリは実行時に生成されるため、存在していなくても問題ない。}}なお、IntermediateOutputPathは、末尾に必ずディレクトリセパレータが入っていることが期待されているため、注意すること。IntermediateOutputPathには$(TargetName)-AssemblyInfo.csが含まれているので、そのまま消さないでおくと、本体のビルド時に重複エラーが出てしまうので、プロジェクトツリー内に一時ディレクトリを作る場合、解析終了時には必ず消しておく必要がある。終わりに通常は凝ったビルド設定をすることもないと思うが、ハマるときはハマるので、この辺りは注意しておきたい。upLoginユーザーは見つかりませんでした。