web-dev-qa-db-ja.com

msbuildをC#6にアップグレードする方法は?

プロジェクトでC#6を使用したい(null伝播、その他の機能)。

VS 2015をPCにインストールしましたが、見事に機能し、次のようなテストコードを作成します

var user = new SingleUserModel(); //all model fields are null
var test = user.User?.Avatar?["blah"];

しかし、プロジェクトをリポジトリにプッシュしてCIがビルドを開始すると、サポートされていない?が原因でビルドが失敗します。

CIサーバーにもVS2015をインストールしましたが、それを使用していないようです。私に何ができる?

CI-C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exeを使用したCruiseControl .NETビルド

102
Anna Prosvetova

必ず電話してください:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe

これは、Visual Studio 2015に付属するMsBuildのバージョンであり、これを理解するC#コンパイラーを呼び出します。 Visual Studio 2015の任意のエディションをインストールするか、スタンドアロン Microsoft Build Tools 2015 をインストールすることにより、システムにこのバージョンのMsBuildを取得できます。

NuGetパッケージの後に への参照を追加すると、新しいコンパイラーの使用も強制されます。

Install-Package Microsoft.Net.Compilers

Install-Packageは、利用可能な最新バージョンを選択することに注意してください。インストールする前に、リリースノートと依存関係を確認して、対処しているバージョンの根本的な問題を解決してください。この場合は、VS 2015に固有のものです。

Visual Studio 2015の場合:

Install-Package Microsoft.Net.Compilers -Version 1.0.0
161
jessehouwing

ところで、ビルドサーバーにVS2015の代わりに「Microsoft Build Tools 2015」をインストールすることもできます。

https://www.Microsoft.com/en-us/download/details.aspx?id=48159

MSBuildを同じパスにインストールします。

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe
59
MuhKuh

おそらくこれはすでに動作していますが、これは将来的に他の誰かを助けるかもしれません。この質問に最近出くわし、正しい方向に進んで、最終的に解決策を導きました。

これに対する別の可能な解決策は、プロジェクトファイルを手動で更新して、プロジェクトのビルドに使用するMSBuildバージョンをターゲットにすることです。

最近、TeamCityビルドサーバーの更新を行って、Microsoft Build Tools 2015を既にインストールしました。ビルドサーバーにすべてが揃っていると思い、C#6.0をターゲットとするソリューションがあり、.net 4.6.1をターゲットとするすべてのプロジェクトがあったと思います。あなたのように、C#6.0固有のコードを備えたすべてのものは私のローカル環境でうまくビルドされましたが、TeamCityビルドサーバーはそれを好まなかったのです。

他の人が言ったように、Microsoft.Net.Compilers NuGetパッケージを使用してみました。最新バージョンでは、ビルドサーバーでビルドを実行できましたが、ローカルでコードを公開することはできませんでした(私の要件)。そのNuGetパッケージの以前のバージョンでは公開できましたが、ビルドは機能しませんでした。

私がしなければならないことがわかったのは、最終的にソリューションの各プロジェクトファイルを変更して、C#6.0コードを処理できるMSBuildバージョンを具体的にターゲットにすることでした。各プロジェクトファイルで、次のような行が見つかりました。

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

その行のキーコンポーネントはToolsVersionの部分です。プロジェクトファイルのこの行を次のように変更しました。

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

ここでの違いは、バージョン4ではなくバージョン14を対象としていたことです。バージョン14.0はビルドツール2015に対応しています。これを変更すると、TeamCityビルドサーバーは正しいMSBuildバージョンを使用し、C#6.0コードをビルドできました。

また、VS2015が適切な処理を行わず、ローカルビルドを台無しにしたため、4.6.1を使用するために、このTargetFrameworkVersion xmlノードを手動で更新する必要がありましたが、ここでは関係ありません。

私が間違っている場合は誰かが私を修正してください、しかし参考のために、バージョン番号は次のようになると思います:

4.0 = VS2012

12.0 = VS2013

14.0 = VS2015

15.0 = VS2017

.net 4.7を使用する場合は、Build Tools 2017をインストールし、プロジェクトを14.0ではなく15.0をターゲットにする必要がありますが、これを確認していません。

9
user1059903