-
Notifications
You must be signed in to change notification settings - Fork 169
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
find-tools.batにおけるMSBuildの探索動作を再検討する #1759
Comments
探索部分の3がおかしいような気がしましたが、おそらく仕様通りです。
記憶があいまいですが、初期はvs2017同梱の「機能制限のあるvswhere」を使わなければならなかったため、vs2017用の探索ロジックとvs2019用の探索ロジックを分けていたように思います。 こういう感じ ちゃんと確認してないので間違いあるかもです。 |
まず現状の動作です find-tools.batにはARG_VSVERSIONを使って値を渡します。 find-tools.batは初回ビルド時またはリビルド時に「1回だけ」呼ばれます。 コマンドラインではbuild-sln.bat で、 つぎにfind-tools.batでの処理です。 VSを一つだけインストールしている時バージョンが渡ってないのにエラーが起きないのは 解決するには find-tools.batを改修する場合 targetsを編集する場合 targetで環境変数を設定した場合、ローカル変数のような扱いになるようです |
質問回答
|
NUM_VSVERSIONはCMD_MSBUILDを設定するために使われており、ここ以外では使わていないようです。 不思議なのはARG_VSVERSIONを使うことに抵抗を感じる方がいることです。 |
「vswhereが期待通りにいかないことがあったから万が一に備えてこうしている」というで理解しました。 |
Bash上でgrepしました。
名前から連想できる使い方と実際の使い方が一致しているのは重要なことだと思います。 |
他のバッチ処理はどうなのか分からないですが、 ARG_VSVERSIONを指定した場合、変換が入ります。 「環境変素なのにARGなのは不適切じゃなかろうか?」は、それとは別の話だと思っています。 |
あらためてARG_VSVERSIONをgrepしてみたんですが、CIで使ってますね。(誤解解消) Lines 109 to 114 in 25281cd
CIのビルド環境にインストールされるvisual studioバージョンは通常1つなので、ymlには要らないように思いました。 それを踏まえて、現在のバッチ構成を改善する案を思いつきました。 現状はこんな感じです。複数verが入ってる端末でvs2019ビルドしたい場合の例。 set ARG_VSVERSION=2019
build-sln.bat x64 Release ※引数じゃないのに引数っぽい名前の環境変数を定義している。 こういう風に打てるようにしたら分かりやすくなると思います。 build-sln.bat x64 Release 2019 第3パラメータを追加して、内部変数 ARG_VSVERSION に代入します。 修正量がボチボチ大きくなるのが懸念ですが、ちょっと見やすくなるはず。。。 |
clearについては引数の形のみでしか設定できませんね。 find-tools.batを編集する場合の懸念点です。 NUM_VSVERSIONはget()があり、set()がない NUM_VSVERSIONを受け付けるということは コマンドプロンプトで NUM_VSVERSIONで意味のある値は15,16,17...だけですが find-tools.batを編集するなら、これからは |
ARG_VSVERSION = バージョンを「手入力」するためのもの。 #1759 (comment) で書いた通り、NUM_VSVERSIONが正しく設定されない、がたまに発生するようです。これの原因は「プログラムの誤り」ではなさそうですが、期待通りに動かないのは不具合として修正すべきと思います。 |
kazasakuさん
「NUM_VSVERSIONに設定しても意味はないです。」と書いた通り、 したがって、find-tools.batが独自にNUM_VSVERSIONを決定しています。 これを修正したいというのが #1755 です。
ARG_VSVERSIONという変数名でなければ、問題ないという意味ですか? |
バッチファイルの改行コードはどうなっていますか? |
berryzplusさん
find-tools.batの:msbuildを追ってみてください
一つしか入ってない環境でもARG_VSVERSIONを指定するのは意味があります。
それはberryzplusさんの変数名から受ける印象ではないですか? コードを見てみたところ、 |
ちょっと考え直してみました。ビルドはこういう過程を経ているように見えます。
ここでtargetsファイルの記述が意図しているのは「実行中のVSと同じもの」ですから、「実行中のVSと同じ意味のもの」では困ります。よって現在の記述が正しいということになるはずです。 逆に言えば、もともと設定されていたNUM_VSVERSIONが書き換えられるのは(値を間違えていない限り)よろしくない気がします。
NUM_VSVERSIONには |
16と17の利用可能な二つのバージョンが入っていて、「俺は16を使いたいんだ」とします。
今の動作にこだわるならそういう解釈ができなくもないですが、疑問③に対していただいた回答ではこだわる理由はないように見受けられます。 |
#1759 (comment) |
githash.targetsで VS2019にて、githash.targetsから呼ばれたfind-tools.batのログ:
|
前書き
find-tools.batにおけるMSBuildの探索ロジックはおかしくないか、という話題が #1755 で出ました。
issue として話題を分割します。
質問
サクラエディタのビルドでは、処理に必要なツールを探索する find-tools.bat というバッチファイルがあります。
このバッチファイルが行う処理のうち、バージョン決定とMSBuildの探索行う部分は次のような動作です。
NUM_VSVERSION
に、見つかったMSBuildへのパスをCMD_MSBUILD
に設定するこの動作について、以下の疑問があります。
NUM_VSVERSION
をあらかじめ設定しても、find-tools.batの動作で上書きされてしまい、意図通りになりません。ARG_VSVERSION
を設定することになっているが、これは本来バッチファイルの引数を保持するものであって、呼び出し時以外に設定するのはおかしいのではないでしょうか。参考資料
Visual Studio Community 2017 workload and component IDs | Microsoft Docs
The text was updated successfully, but these errors were encountered: