Bagaimana cara mengupgrade msbuild ke C # 6?

106

Saya ingin menggunakan C # 6 dalam proyek saya (propagasi null, fitur lainnya).

Saya telah menginstal VS 2015 di PC saya dan berfungsi dengan baik dan membuat kode pengujian seperti

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

Tetapi ketika saya mendorong proyek saya ke repo dan CI mulai membangunnya, build gagal karena tidak didukung ?.

Saya telah menginstal VS2015 di server CI juga tetapi sepertinya tidak menggunakannya. Apa yang dapat saya?

CI - CruiseControl .NET Dibuat dengan C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

Anna Prosvetova
sumber
3
Bagi siapa pun yang mengunduh MS Build Tools 2015 dari tautan yang diberikan di bawah ini, itu adalah untuk versi lama (pra-pembaruan) yang memiliki bug ... Saya menemukan tautan di sini untuk Pembaruan 3. 2015
bdrajer

Jawaban:

164

Pastikan Anda menelepon:

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

Itu adalah versi MsBuild yang disertakan dengan Visual Studio 2015 dan memanggil compiler C # yang memahami hal ini. Anda bisa mendapatkan versi MsBuild ini di sistem Anda dengan menginstal setiap edisi Visual Studio 2015 atau dengan menginstal Microsoft Build Tools 2015 yang berdiri sendiri .

Menambahkan referensi ke paket NuGet berikut juga akan memaksa penggunaan kompilator baru:

Install-Package Microsoft.Net.Compilers

Harap dicatat Install-Package akan memilih versi terbaru yang tersedia yang mungkin bukan versi yang Anda cari. Sebelum Anda menginstal, periksa catatan rilis dan dependensi untuk menyelesaikan masalah mendasar dengan versi yang ditangani, yang dalam hal ini, lebih spesifik untuk VS 2015.

Jadi untuk Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0
jessehouwing
sumber
2
apakah ada kekhawatiran tentang hal ini yang menyebabkan bug sejak RyuJIT atau apa pun yang memiliki banyak bug?
Maslow
3
Hanya catatan tentang ini, jika Anda memperbarui variabel env PATH Anda, pastikan untuk menghapus lokasi lama (mis .: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319) karena mungkin masih memanggilnya saat menjalankan "msbuild "dari cmd
TheWebGuy
2
Saya juga harus menginstal paket nuget Microsoft.Net.Compilers: lihat stackoverflow.com/a/36774876/584714
DrGriff
2
Apakah ada solusi untuk ini tanpa harus memasang paket nuget ke setiap proyek? Saya memiliki 100 proyek yang membutuhkan ini dan tampaknya tidak perlu bagi saya. Sepertinya ada serangga di suatu tempat.
Cole W
2
Apakah ada yang punya jawaban untuk pertanyaan @ColeW?
Zinov
61

Anda juga dapat menginstal "Microsoft Build Tools 2015" sebagai ganti VS2015 di server build Anda.

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

Ini menginstal MSBuild ke jalur yang sama:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe
MuhKuh
sumber
IMHO ada penyebabnya, mengapa pertanyaannya berkaitan dengan lingkungan itu. Lebih baik berikan komentar untuk pertanyaan itu.
jogo
24
Karena stackoverflow tidak mengizinkan saya mengomentari pertanyaan, saya mempostingnya satu-satunya cara yang diizinkan oleh sistem. Dan jika Anda tidak merasa berguna, abaikan saja. Bagi saya saat mencari solusi di server build saya, inilah cara yang harus dilakukan, daripada menginstal VS2015
MuhKuh
Setelah Anda menginstal "Microsoft Build Tools 2015" (atau "Microsoft Build Tools 2017") Anda juga memiliki kendali atas versi Visual Studio mana yang ingin Anda gunakan untuk membangun solusi: MSBuild.exe / t: Build YourSolution.sln / p : VisualStudioVersion = 14.0 [setel ke 10.0 untuk VS2010, ke 14.0 untuk VS2015 dan 15.0 untuk VS2017]
Alex Sanséau
Untuk mengunduh dan menginstal Microsoft Build Tools 2015 Update 3 , silakan kunjungi unduhan VS yang lebih lama dan buka Redistributables and Build Toolsbagian.
NSP
12

Anda mungkin sudah memiliki ini berfungsi, tetapi ini mungkin membantu orang lain di masa depan. Saya menemukan pertanyaan ini baru-baru ini dan itu membuat saya bergerak ke arah yang benar dan akhirnya mengarah pada solusi.

Solusi lain yang mungkin untuk ini adalah memperbarui file proyek Anda secara manual untuk menargetkan versi MSBuild yang Anda inginkan untuk membangun proyek Anda.

Saya baru-baru ini melalui pembaruan server build TeamCity dan saya sudah menginstal Microsoft Build Tools 2015 di dalamnya. Saya pikir saya memiliki segalanya di server build, solusi saya menargetkan C # 6.0, dan saya memiliki setiap project yang menargetkan .net 4.6.1. Seperti Anda, semuanya dengan kode khusus C # 6.0 dibangun dengan baik di lingkungan lokal saya, tetapi server build TeamCity saya tidak menyukainya.

Seperti yang disebutkan oleh orang lain, saya mencoba menggunakan paket Microsoft.Net.Compilers NuGet. Versi terbaru memungkinkan build berfungsi di server build saya, tetapi tidak mengizinkan saya mempublikasikan kode saya secara lokal (persyaratan saya). Versi sebelumnya dari paket NuGet memungkinkan saya menerbitkannya, tetapi build tidak akan berfungsi.

Apa yang saya temukan yang harus saya lakukan pada akhirnya adalah memodifikasi setiap file proyek dalam solusi saya untuk secara khusus menargetkan versi MSBuild yang dapat menangani kode C # 6.0. Di setiap file proyek saya, saya menemukan baris yang mirip dengan baris berikut:

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

dengan komponen kunci dari baris tersebut menjadi bagian ToolsVersion . Saya hanya mengubah baris ini pada file proyek saya untuk membaca yang berikut:

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

Perbedaannya di sini adalah saya menargetkan versi 14, bukan 4. Versi 14.0 sesuai dengan Build Tools 2015. Dengan mengubahnya, server build TeamCity saya menggunakan versi MSBuild yang benar dan dapat membuat kode C # 6.0 saya.

Saya juga harus memperbarui node xml TargetFrameworkVersion ini secara manual untuk menggunakan 4.6.1 karena VS2015 tidak melakukan sesuatu dengan benar dan mengacaukan build lokal saya, tetapi itu tidak relevan di sini.

Tolong, seseorang mengoreksi saya jika saya salah, tetapi hanya untuk referensi, saya pikir nomor versinya seperti ini:

4.0 = VS2012

12.0 = VS2013

14.0 = VS2015

15.0 = VS2017

Saya yakin jika Anda ingin menggunakan .net 4.7, Anda harus menginstal Build Tools 2017 dan proyek Anda menargetkan 15.0, bukan 14.0, tetapi saya belum memverifikasi ini.

pengguna1059903
sumber