Làm thế nào để nâng cấp msbuild lên C # 6?


106

Tôi muốn sử dụng C # 6 trong dự án của mình (truyền null, các tính năng khác).

Tôi đã cài đặt VS 2015 trên PC của mình và nó hoạt động tuyệt vời và xây dựng mã thử nghiệm như

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

Nhưng khi tôi đẩy dự án của mình lên repo và CI bắt đầu xây dựng nó, thì quá trình xây dựng không thành công do không được hỗ trợ ?.

Tôi cũng đã cài đặt VS2015 trên máy chủ CI nhưng looke như thể nó không sử dụng nó. Tôi có thể làm gì?

CI - CruiseControl .NET xây dựng với C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe


3
Cho bất cứ ai tải MS Công cụ xây dựng năm 2015 từ các liên kết đưa ra dưới đây, họ cho một tuổi (pre-update) phiên bản có lỗi ... Tôi tìm thấy một liên kết ở đây đến năm 2015 Cập nhật 3.
bdrajer

Câu trả lời:


164

Hãy chắc chắn rằng bạn gọi:

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

Đó là phiên bản MsBuild đi kèm với Visual Studio 2015 và gọi trình biên dịch C # hiểu điều này. Bạn có thể tải phiên bản MsBuild này trên hệ thống của mình bằng cách cài đặt bất kỳ phiên bản nào của Visual Studio 2015 hoặc bằng cách cài đặt Microsoft Build Tools 2015 độc lập .

Thêm một tham chiếu đến gói NuGet sau đây cũng sẽ buộc sử dụng trình biên dịch mới:

Install-Package Microsoft.Net.Compilers

Xin lưu ý rằng Install-Package sẽ chọn phiên bản mới nhất hiện có có thể không phải là phiên bản bạn đang tìm kiếm. Trước khi bạn cài đặt, vui lòng kiểm tra các ghi chú phát hành và phần phụ thuộc để giải quyết vấn đề cơ bản với phiên bản đang được xử lý, trong trường hợp này, cụ thể hơn cho VS 2015.

Vì vậy, đối với Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0

2
có bất kỳ lo ngại nào về điều này gây ra lỗi vì RyuJIT hoặc bất kỳ thứ gì có quá nhiều lỗi không?
Maslow

3
Chỉ cần lưu ý về điều này, nếu bạn đang cập nhật biến env PATH của mình, hãy nhớ xóa vị trí cũ (ví dụ: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319) vì nó vẫn có thể gọi như vậy khi thực thi "msbuild "từ cmd
TheWebGuy

2
Tôi cũng phải cài đặt gói
nuget

2
Có giải pháp nào cho việc này mà không cần phải cài đặt gói nuget vào mọi dự án không? Tôi có 100 dự án cần điều này và nó dường như không cần thiết đối với tôi. Có vẻ như một lỗi ở đâu đó.
Cole W

2
Có ai có câu trả lời cho câu hỏi @ColeW không?
Zinov

61

Bằng cách này, bạn cũng có thể cài đặt "Microsoft Build Tools 2015" thay vì VS2015 trên máy chủ xây dựng của bạn.

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

Nó cài đặt MSBuild vào cùng một đường dẫn:

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

IMHO có một nguyên nhân, tại sao câu hỏi liên quan đến môi trường đó. Tốt hơn hãy bình luận cho câu hỏi.
jogo

24
Vì stackoverflow không cho phép tôi bình luận về các câu hỏi, nên tôi đã đăng nó theo cách duy nhất mà hệ thống cho phép. Và nếu bạn không thấy nó hữu ích, hãy bỏ qua nó. Đối với tôi trong khi tìm kiếm các giải pháp về xây dựng máy chủ của tôi đây là con đường để đi, thay vì cài đặt VS2015
MuhKuh

Khi bạn đã cài đặt "Microsoft Build Tools 2015" (hoặc "Microsoft Build Tools 2017"), bạn cũng có quyền kiểm soát phiên bản Visual Studio bạn muốn sử dụng để xây dựng giải pháp: MSBuild.exe / t: Build YourSolution.sln / p : VisualStudioVersion = 14.0 [đặt nó thành 10.0 cho VS2010, thành 14.0 cho VS2015 và 15.0 cho VS2017]
Alex Sanséau

Để tải xuống và cài đặt Microsoft Build Tools 2015 Update 3 , vui lòng truy cập các bản tải xuống VS cũ hơn và đi tới Redistributables and Build Toolsphần.
RBT

12

Bạn có thể đã làm việc này, nhưng nó có thể giúp ích cho người khác trong tương lai. Tôi đã gặp câu hỏi này gần đây và nó đã giúp tôi đi đúng hướng và cuối cùng dẫn đến một giải pháp.

Một giải pháp khả thi khác cho việc này là cập nhật thủ công các tệp dự án của bạn để nhắm mục tiêu phiên bản MSBuild mà bạn muốn các dự án của mình được xây dựng.

Gần đây tôi đã trải qua bản cập nhật máy chủ xây dựng TeamCity và tôi đã cài đặt Microsoft Build Tools 2015 trên đó. Tôi nghĩ rằng tôi đã có mọi thứ trên máy chủ xây dựng, tôi có giải pháp nhắm mục tiêu C # 6.0 và tôi đã nhắm mục tiêu mọi dự án .net 4.6.1. Giống như bạn, mọi thứ với mã cụ thể C # 6.0 đều được xây dựng tốt trong môi trường cục bộ của tôi, nhưng máy chủ xây dựng TeamCity của tôi không thích bất kỳ điều nào trong số đó.

Như những người khác đã đề cập, tôi đã thử sử dụng gói Microsoft.Net.Compilers NuGet. Phiên bản mới nhất của nó cho phép bản dựng hoạt động trên máy chủ bản dựng của tôi, nhưng nó sẽ không cho phép tôi xuất bản mã cục bộ (một yêu cầu của tôi). Các phiên bản trước của gói NuGet đó sẽ cho phép tôi xuất bản, nhưng bản dựng sẽ không hoạt động.

Những gì tôi thấy rằng tôi phải làm cuối cùng là sửa đổi từng tệp dự án trong giải pháp của mình để nhắm mục tiêu cụ thể phiên bản MSBuild có thể xử lý mã C # 6.0. Trong mỗi tệp dự án của mình, tôi tìm thấy một dòng tương tự như dòng sau:

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

với thành phần chính của dòng đó là phần ToolsVersion của nó. Tôi chỉ cần thay đổi dòng này trên các tệp dự án của mình để đọc như sau:

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

Sự khác biệt ở đây là tôi đang nhắm mục tiêu phiên bản 14, không phải 4. Phiên bản 14.0 tương ứng với Build Tools 2015. Bằng cách thay đổi điều này, máy chủ xây dựng TeamCity của tôi đã sử dụng đúng phiên bản MSBuild và có thể tạo mã C # 6.0 của tôi.

Tôi cũng phải cập nhật theo cách thủ công nút xml TargetFrameworkVersion của cái này để sử dụng 4.6.1 vì VS2015 không làm đúng cách và làm rối bản dựng cục bộ của tôi, nhưng điều đó không liên quan ở đây.

Làm ơn, ai đó sửa cho tôi nếu tôi sai, nhưng chỉ để tham khảo, tôi nghĩ số phiên bản giống như thế này:

4.0 = VS2012

12.0 = VS2013

14.0 = VS2015

15.0 = VS2017

Tôi tin rằng nếu bạn muốn sử dụng .net 4.7, bạn phải cài đặt Build Tools 2017 và có các dự án của bạn nhắm mục tiêu 15.0 thay vì 14.0, nhưng tôi chưa xác minh điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.