web-dev-qa-db-ja.com

Visual Studio 2015で特定のToolsVersionを使用する簡単な方法はありますか?

特定のバージョンのmsbuildを使用してプロジェクトまたはソリューションをビルドする場合、/toolsversionまたは/tvスイッチを使用して以前の.netツールチェーンを選択できます。

"C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln

これはmsbuildのすべてのバージョンで機能し、csc.exeなどのバージョンは上記に基づいて正しく選択されます。

> "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:4.0 amazing.sln
...
CoreCompile:
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ...
...

> "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln
...
CoreCompile:
  C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe ...
...

I do n't/tvを指定した場合、使用しているmsbuildのバージョンといくつかの環境変数に応じて、次のいずれかを取得できます。

  • プロジェクトファイルの最上位要素で指定されたToolsVersion
  • 使用しているmsbuild.exeのバージョンに対応するToolsVersion
  • msbuild.exe.configの値
  • レジストリからの値

MSDNのツールバージョン設定のオーバーライドページの異なるバージョン を参照してください)。

したがって、ビルドサーバーとローカルマシンで一貫した結果を得るために、/tvの実行時にmsbuild.exeを使用します(実際、これはpsakeで強制されますまた、対応するバージョンのmsbuild.exeを使用することを保証するスクリプト。

ただし、Visual Studioでビルドするときに/tvスイッチを使用できません。代わりに、Visual Studio 2013以降では、そのバージョンのVisual Studioに付属している.netツールチェーンを使用しますnless

  • 環境変数MSBUILDLEGACYDEFAULTTOOLSVERSIONが設定されていますand ...
  • ...すべてのプロジェクトファイルには、使用するバージョンに設定されたToolsVersion属性があります。

これはとてもバロック的で、実際に誰かがそれをやっているとは信じられません。したがって、私の質問は次のとおりです。

  • Is誰かがMSBUILDLEGACYDEFAULTTOOLSVERSIONのことをしていますか?
  • そうでない場合、Visual Studioに特定のToolsVersionを使用させる別の方法はありますか?バージョン管理(プロジェクトやその他の設定ファイル)に保存できるものが理想的です。

そして最後に:

  • 私も気にする必要がありますか? C#コンパイラの各バージョンが以前のバージョンの入力を処理できる必要があり、プロジェクトファイルでターゲットの.netフレームワークとC#言語レベルを設定できる場合、繰り返し可能なビルドを保証するにはこれで十分ですか?

(私の偏見は、私がshould気にするということです。

  • IDEとビルドサーバーでのビルドを同じにしたい(もちろん)
  • VS2015(および将来のバージョン)を使用できるようにしたいのは、以前のバージョンよりも優れているIDEですが、決定するまで新しいツールチェーンを使用する義務はありません。

おそらく私はやりたい...)

問題の具体例については、githubの msbuild-vs-vs2015-toolsversion リポジトリを参照してください。


背景:同僚の1人がVisual Studio 2015のコピーでRoslynを使用して正常にコンパイルしたC#6.0コードを送信したときにCIビルドエラーが発生したが、CIで失敗したため、これを求めていますthat = .netツールチェーンの以前のリリースを使用します(セッターなしで自動プロパティを使用しました。これはRoslynでは問題ありませんが、以前のバージョンでは問題ありません)。 CIビルドをRoslynに更新しますが、将来この種のことを防ぐことができるかどうかを見たかったのです。

47
Guy Bolton King

これを解決するには、ビルド中に一時的に環境変数MSBUILDDEFAULTTOOLSVERSIONを設定するVisual Studio拡張機能を作成しました。使用される値は、.toolsversionファイルと同じディレクトリにあるファイル.slnから読み取られます。 psakeスクリプトは同じ.toolsversionファイルを読み取り、/tvスイッチに値を渡します。

拡張機能のコードは次の場所にあります: https://github.com/guyboltonking/set-toolsversion-extension 。残念ながら、現時点ではC++やVisual Studioを使用していないため、サポートを提供することはできません(ただし、数か月間はまったく問題なく使用できたと言えます)。

MSBUILDDEFAULTTOOLSVERSIONの存在を思い出させてくれた@efarukに感謝します。

編集:@ mbadawi23のおかげで、VS2015とVS2017の両方で拡張機能を使用できるようになりました。

6
Guy Bolton King

Visual Studio 2015で特定のC#バージョンを強制するには、プロジェクトプロパティ->ビルド->詳細->言語バージョンに移動します。

これを5に設定すると、コンパイラはC#6の機能について文句を言います。機能「...」はC#5では使用できません。言語バージョン6以降を使用してください。

Alternativly ReSharperには、このためのツールもいくつかあります。

3
oddbear

注:msbuildファイルをいつでも作成して、プロジェクトのビルドやプロジェクトの自己変更を使用してプロジェクトをビルドできます。また、ツールのバージョンを条件付きで決定できます( https://msdn.Microsoft.com/en-us/library /7z253716.aspx )(。csprojは、異なる拡張子を持つ構造化msbuildスクリプトでもあり、VSとの互換性もあります)。

よろしく...

編集:

https://msdn.Microsoft.com/en-us/library/bb383985.aspx

ソリューション内のプロジェクトで$(ProjectToolsVersion)プロパティを設定します。これにより、他のプロジェクトとは異なるツールセットバージョンのソリューションでプロジェクトをビルドできます。

だから、あなたはあなたの答えを持っていると思う;)

2
efaruk