特定のバージョンの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のバージョンといくつかの環境変数に応じて、次のいずれかを取得できます。
msbuild.exe
のバージョンに対応するToolsVersionmsbuild.exe.config
の値( MSDNのツールバージョン設定のオーバーライドページの異なるバージョン を参照してください)。
したがって、ビルドサーバーとローカルマシンで一貫した結果を得るために、/tv
の実行時にmsbuild.exe
を使用します(実際、これはpsake
で強制されますまた、対応するバージョンのmsbuild.exe
を使用することを保証するスクリプト。
ただし、Visual Studioでビルドするときに/tv
スイッチを使用できません。代わりに、Visual Studio 2013以降では、そのバージョンのVisual Studioに付属している.netツールチェーンを使用しますnless:
MSBUILDLEGACYDEFAULTTOOLSVERSION
が設定されていますand ...これはとてもバロック的で、実際に誰かがそれをやっているとは信じられません。したがって、私の質問は次のとおりです。
MSBUILDLEGACYDEFAULTTOOLSVERSION
のことをしていますか?そして最後に:
(私の偏見は、私がshould気にするということです。
おそらく私はやりたい...)
問題の具体例については、githubの msbuild-vs-vs2015-toolsversion リポジトリを参照してください。
背景:同僚の1人がVisual Studio 2015のコピーでRoslynを使用して正常にコンパイルしたC#6.0コードを送信したときにCIビルドエラーが発生したが、CIで失敗したため、これを求めていますthat = .netツールチェーンの以前のリリースを使用します(セッターなしで自動プロパティを使用しました。これはRoslynでは問題ありませんが、以前のバージョンでは問題ありません)。 CIビルドをRoslynに更新しますが、将来この種のことを防ぐことができるかどうかを見たかったのです。
これを解決するには、ビルド中に一時的に環境変数MSBUILDDEFAULTTOOLSVERSION
を設定するVisual Studio拡張機能を作成しました。使用される値は、.toolsversion
ファイルと同じディレクトリにあるファイル.sln
から読み取られます。 psakeスクリプトは同じ.toolsversion
ファイルを読み取り、/tv
スイッチに値を渡します。
拡張機能のコードは次の場所にあります: https://github.com/guyboltonking/set-toolsversion-extension 。残念ながら、現時点ではC++やVisual Studioを使用していないため、サポートを提供することはできません(ただし、数か月間はまったく問題なく使用できたと言えます)。
MSBUILDDEFAULTTOOLSVERSION
の存在を思い出させてくれた@efarukに感謝します。
編集:@ mbadawi23のおかげで、VS2015とVS2017の両方で拡張機能を使用できるようになりました。
Visual Studio 2015で特定のC#バージョンを強制するには、プロジェクトプロパティ->ビルド->詳細->言語バージョンに移動します。
これを5に設定すると、コンパイラはC#6の機能について文句を言います。機能「...」はC#5では使用できません。言語バージョン6以降を使用してください。
Alternativly ReSharperには、このためのツールもいくつかあります。
注:msbuildファイルをいつでも作成して、プロジェクトのビルドやプロジェクトの自己変更を使用してプロジェクトをビルドできます。また、ツールのバージョンを条件付きで決定できます( https://msdn.Microsoft.com/en-us/library /7z253716.aspx )(。csprojは、異なる拡張子を持つ構造化msbuildスクリプトでもあり、VSとの互換性もあります)。
よろしく...
編集:
https://msdn.Microsoft.com/en-us/library/bb383985.aspx
ソリューション内のプロジェクトで
$(ProjectToolsVersion)
プロパティを設定します。これにより、他のプロジェクトとは異なるツールセットバージョンのソリューションでプロジェクトをビルドできます。
だから、あなたはあなたの答えを持っていると思う;)