web-dev-qa-db-ja.com

BATファイルからVisual Studio 2017 RCのMSBuildバージョンを呼び出すにはどうすればよいですか?

MSBuildの以前のバージョンは、次の場所にあります:%programfiles(x86)%\msbuild\<version>\bin\msbuild.exe.

ただし、Visual Studio 2017RCの場合、パスは%programfiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exeです。インストールの種類:エンタープライズ、コミュニティ、またはプロフェッショナルは、パスの一部であるようです。そして、それは、異なるバージョンのVisual Studio 2017を備えた多くの異なるコンピューターで動作するはずのBATファイルでmsbuildへの正しいパスを指定することを困難にします。

BatファイルからVisual Studio 2017 RCのMsbuildのバージョンを呼び出す最良の方法は何ですか?またはPowerShellから?

44
Arve

Microsoftは、Visual Studio 2017以降の場所を見つけるツールを作成しました https://github.com/Microsoft/vswhere

このオプション以降は this ブログ投稿で説明されています。

18
Arve

サポートされている方法

VS2017のセットアップエンジンには、相互運用APIがあり、VS2017のどのインスタンスがインストールされているかに関する情報を照会できます。それには NuGetパッケージ があり、インストールパスを含む サンプル のクエリ方法もあります。バッチファイルまたはPSファイルで使用するには、サンプルアプリを書き換えて、スクリプトから呼び出して必要な情報を出力するだけです。

サポートされていない方法

VSセットアップエンジンは、%ProgramData%\Microsoft\VisualStudio\Packages\_Instancesの下にデータのストアを保持します。 VS2017の各インスタンス用のフォルダーがあり、そのフォルダー内には、インストールパスなど、そのインストールに関する情報を含むstate.jsonファイルがあります。

.jsonファイルから情報を抽出する必要があるため、スクリプトファイルから呼び出すアプリを作成するか、スクリプトで解析ロジックを直接作成するオプションがあります。 JSONスキーマまたはファイルの場所が変更される可能性があるため、これは明らかに脆弱です。

ブルートフォース法

デフォルトのインストールパスを使用している場合、%ProgramFiles(x86)%\Microsoft Visual Studio\の下でmsbuild.exeを再帰的に検索できます(VSインスタンスごとに32ビットおよび64ビットのmsbuild.exeがあるようです)。これはおそらくスクリプトファイル内で行うのが最も簡単ですが、デフォルトのインストールパス(または検索対象のハードコーディングされたパス)に依存しています。

開発環境の要件を変更する

最後にできることは、VS開発環境を使用するために、開発者がvsdevcmd.batを使用する(または何らかの方法で呼び出す)ことを要求することです。これにより、MSBuildおよびVS環境のその他のツールが%PATH%に追加されます。これは開発チームに要件を課しますが、msbuild.exeを見つけるために常に公式にサポートされる方法です。

25
Jimmy

最も簡単な方法...

Right at the bottom of the download page on VS

  • 利益;ビルドツールは、VS SKUに関係なく、インストールするすべての場所で標準的な別の場所にインストールされます(プロ/エンタープライズ/コミュニティはすべて異なるパスにインストールされます)
  • 新しい場所C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe
8
Chris McKee

まだマシン上のmsbuildの最新バージョンを探し、代わりに使用可能な場合は古いバージョンにフォールバックしようとしている人々のためにこれを投稿します。 powershellのこのスニペットは、簡単に batファイルから呼び出される であるトリックを行うことがわかります。

Function Find-MsBuild([int] $MaxVersion = 2017)
{
    $agentPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe"
    $devPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe"
    $proPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe"
    $communityPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
    $fallback2015Path = "${Env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild.exe"
    $fallback2013Path = "${Env:ProgramFiles(x86)}\MSBuild\12.0\Bin\MSBuild.exe"
    $fallbackPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319"

    If ((2017 -le $MaxVersion) -And (Test-Path $agentPath)) { return $agentPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $devPath)) { return $devPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $proPath)) { return $proPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $communityPath)) { return $communityPath } 
    If ((2015 -le $MaxVersion) -And (Test-Path $fallback2015Path)) { return $fallback2015Path } 
    If ((2013 -le $MaxVersion) -And (Test-Path $fallback2013Path)) { return $fallback2013Path } 
    If (Test-Path $fallbackPath) { return $fallbackPath } 

    throw "Yikes - Unable to find msbuild"
}


$msbuildPath = Find-MsBuild 2017
6
alastairtree

VS 2017がリリースされたので、2セントを追加すると便利だと思いました。

バッチファイルの作成:

メモ帳を開く

以下をコピーしてメモ帳に貼り付け、構築するソリューションを[My Solution Name Here]に置き換えます。

@echo off

:variables
SET msBuildLocation="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
SET solutionDirectory=[My Solution Location Here]
SET batchFileLocation=[BatchFileLocation Here]

cd %solutionDirectory%

echo Building MS files for [My Solution Name Here].

call %msBuildLocation% [My Solution Name].sln /p:Configuration=Debug /m:4 /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:false  /consoleloggerparameters:Summary;ShowTimestamp;ShowEventId;PerformanceSummary
echo -
echo --------Done building [My solution name here].--------------
echo -

cd %batchFileLocation%

バッチファイルを.bat拡張子を付けて好きな名前で保存します。 .txtの代わりにすべてのファイルを選択してください。そうしないと機能しません。保存した場所にcdコマンドを発行してバッチファイルを呼び出すと、動作するはずです。または、ダブルクリックします。できた.

Visual Studioの私のバージョンはコミュニティです。パスを適切なバージョンに置き換える必要があります。

4
cloudstrifebro

CIサーバー上のbatファイルからビルドツールも実行します。見つかった新しい場所は次のとおりです。

%programfiles(x86)%\ Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe

3
Ali Hus

.NET Coreツールプレビュー3以降をインストールしている場合、dotnet CLIがデフォルトで%PATH%で使用できるはずです(.NET Coreプロジェクトをビルドしていない場合でも) dotnet msbuildを試すことができます。参照 https://github.com/dotnet/docs/blob/master/docs/core/preview3/tools/dotnet-msbuild.md

1
Stylpe