標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

*.vcxproj/vbproj/csproj のパーサーを書いているが、$(VCTargetsPath)の導出元がわからない

Visual Studio のプロジェクトで生成されるプロダクト(実行ファイル・DLLファイル)のパスを生成する機能が vf1s.exe に必要なので、"encoding/xml".Unmarshal関数 で読み取っていました。

Unmarshal 関数は、タグに合わせてフィールドを用意した構造体に解析結果を放り込むというもので、解釈する XML タグの種類がそれほど多くない場合などには非常にお手軽で便利なんですが、プロジェクトファイルのように「任意の Condition 属性の中にある条件式が真の時だけタグの中身を有効にする」というif 文的な処理はさすがに厳しいので、こちらの記事を参考にして、タグの開始時・終了時・その他の部分をトークン化して読み出すDecoder関数を使うようにしました。 (一応、GoDoc さらしときます→ https://godoc.org/github.com/zetamatta/vf1s/projs

これで、手元にあるプロジェクトファイルでは概ねうまくゆくようになったんですが、まだ一部ちゃんと解釈できていないところがありまして… $(VCTargetsPath) などデフォルトで設定されている変数の値なんですね。これがわからないと <Import> タグで取り込むファイルのフルパスも導出できないんです。

Visual Studio 2019 Community Edition の $(VCTargetsPath) に限って言うと、C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\ になるみたいなんですが、あらゆるバージョンの Visual Studio での普遍的な値を得るための方法が不明。ググってみてはいるんですが

  • Visual Studio というよりは MSBuild がこれらの変数を定義している
  • レジストリに定義があるようだが、これがとんでトラブルになるケースが多い

ということくらいしかわかりませぬ。これさえ分かれば、他の変数もインポート先の XML 経由で得られるんですが、ぐぬぬ