Back to page

− Links

 Print 

技術系備忘録​/C++​/VisualStudio​/MSBuild.exeのパスを解決して実行 :: シンクリッジ

xpwiki:技術系備忘録/C++/VisualStudio/MSBuild.exeのパスを解決して実行

開発の現場では作業の敷居を上げないために、シンプルな開発環境構築手順ってとても大事だと思います。

外部ライブラリであっても、このサイトからダウンロードしてビルドして出来上がったファイルはココに置いてパスを通して・・・みたいなことを各開発者に強いるのはなるべく避けたい。
Clone(Checkout)した後に、このスクリプトだけ叩けばOK!くらいまでシンプルだと理想だなと思います。

昨今は色々な言語でパッケージ管理ツール的なものが一般的に使われてると思うのですが、C++ 界隈ではソースをダウンロードして自分で手作業でビルドするものが多々あり、windows の場合は VC のプロジェクトファイルをビルドすべしっていうものがけっこうあります。

そこで必要になるのが VC プロジェクトをコマンドラインでビルドするために必要な MSBuild.exe。

がしかし困ったことに MSBuild.exe の配置場所(パス)って固定ではありません。環境事にバラバラです。
で、それを解決する為に(かどうかはわかりませんが) VisualStudio では vswhere.exe っていうのがあり、それを叩けば MSBuild.exe のパスが取れるよ。というような記事を目にしたことがあります。

なので、vswhere.exe を叩いておくようにすれば VisualStudio をバージョンアップしてもちゃんと動くんだろうからコレを使っておこう。と安心していたんですが、VisualStudio2019 をインストールしたら、MSBuild.exe のパスが取れなくなってしまいました。
さすがに、「このプロジェクトでは VisualStudio2017 を使うので 2019 はインストールするべからず!」みたいな開発環境ルールは避けたいので、VisualStudio2019 がインストールされている環境でも期待通り MSBuild.exe を叩ける bat を用意したので備忘録兼ねて載せておきます。

ネット上の情報をかき集めた知識でこさえてみました。感謝です。

Table of contents
  • 使い方
  • MSBuild.bat
      • 備考

使い方 anchor.png[1]

> MSBuild.bat c:\app\app.vcxproj

こんな感じで使うと、インストールされている最新の MSBuild.exe でビルドを行います。

VisualStudio2019、2017、2015 の環境までは確認しています。

Page Top

MSBuild.bat anchor.png[2]

:: MSBuild.exe %*

@echo off
setlocal
:: cd /d %~dp0

set PF32=%ProgramFiles(x86)%
if not exist "%PF32%" set PF32=%ProgramFiles%

set VsWherePath="%PF32%\Microsoft Visual Studio\Installer\vswhere.exe"

:: vs2019 or later
for /f "usebackq tokens=*" %%i in (`%VsWherePath% -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe`) do (
	if exist "%%i" (
		set MSBuildPath="%%i"
		goto :run
	)
)

:: vs2017 or earlier
for /f "usebackq tokens=1* delims=: " %%i in (`%VsWherePath% -latest -requires Microsoft.Component.MSBuild`) do (
	if /i "%%i"=="installationPath" (
		if exist "%%j\MSBuild\15.0\Bin\MSBuild.exe" (
			set MSBuildPath="%%j\MSBuild\15.0\Bin\MSBuild.exe"
			goto :run
		)
		if exist "%%j\MSBuild\14.0\Bin\MSBuild.exe" (
			set MSBuildPath="%%j\MSBuild\14.0\Bin\MSBuild.exe"
			goto :run
		)
		if exist "%%j\MSBuild\12.0\Bin\MSBuild.exe" (
			set MSBuildPath="%%j\MSBuild\12.0\Bin\MSBuild.exe"
			goto :run
		)
	)
)

:run
if not exist %MSBuildPath% (
	echo "MSBuild.exe not find"
	exit /b 1
)

echo on
%MSBuildPath% %*
Page Top

備考 anchor.png[3]

VisualStudio2019 の vswhere.exe には -find っていうオプションが追加されたようで、それを使うのが王道らしいので、それを使っています。
が、当然 VisualStudio2019 が未インストールの環境では、-find を指定してもエラーになります。
で、エラーが返ってきてもファイルの有無チェックで弾くことで VisualStudio2019 未満向けの処理に流れるっていう寸法です。
あんまりスマートじゃないやり方な気がしますが、他に妙案が思いつかないです・・。
もしもっと良い方法があればご助言頂けると幸いです。


Last-modified: 2019-11-04 (Mon) 21:05:15 (JST) (32d) by takatsuka