Mối quan hệ giữa cli dotnet và msbuild vs2017 mới


84

Với việc chuyển từ định dạng project.jsonmới được csprojgiới thiệu với VS2017, tôi đang đấu tranh để hiểu sự khác biệt giữa dotnetcli và mới msbuildvà khi nào sử dụng cái này thay cho cái khác.

1) Để xây dựng một csprojthư viện net tiêu chuẩn mới từ dòng lệnh, tôi nên gọi dotnetcli (ví dụ dotnet restore dotnet build) hay sử dụng msbuild(ví dụ msbuild ExampleNetstandard.sln).

2) Ngoài ra, tôi hiểu rằng có hai phiên bản msbuild, một phiên bản được xây dựng trên khung đầy đủ và một nhắm mục tiêu khác dotnet core. Điều này có chính xác? Tôi có nên luôn sử dụngdotnet version

3) Là dotnet cliđộc lập hay cần msbuildphải cài đặt? Ví dụ: khi bạn cài đặt dotnet SDK, cài đặt này cũng có msbuild? Nếu vậy điều này có khác với phiên bản được cài đặt với vs2017 không?

Câu trả lời:


142

Câu hỏi

1) Để xây dựng một thư viện netstandard csproj mới từ dòng lệnh, tôi nên gọi dotnet cli (ví dụ: dotnet khôi phục bản dựng dotnet) hay sử dụng msbuild (ví dụ msbuild ExampleNetstandard.sln).

Cả hai đều làm tốt vì hiện tại dotnetđược xây dựng trên đầu trang msbuild. Vì vậy, đó là một vấn đề của hương vị. Bạn cũng có thể gọi các nhiệm vụ msbuild bằng cách sử dụng dotnet CLI. ( dotnet msbuild <msbuild_arguments>)

Ban đầu, tất cả nội dung cốt lõi của .NET chỉ ở trong dotnetvà không ở trong msbuild. Điều này rất cồng kềnh vì nhiều thứ đã được xây dựng sẵn msbuildkhông hoạt động tốt khi dotnetxuất xưởng (ví dụ: Xamarin). Vì vậy, họ đã chuyển nội dung đến msbuildvà xây dựng dotnettrên đầu trang msbuild.

dotnetcó một số tính năng không có trong msbuild, như dotnet new. Theo tôi, dotnetdễ sử dụng hơn msbuild, vì vậy tôi thích hơn dotnet.

Để làm cho nó rõ ràng hơn, tôi đã thêm một so sánh giữa msbuilddotnetở cuối bài đăng của tôi.

2) Ngoài ra, sự hiểu biết của tôi là có hai phiên bản của msbuild, một phiên bản được xây dựng trên khuôn khổ đầy đủ và một lõi dotnet nhắm mục tiêu khác. Điều này có chính xác? Tôi có nên luôn sử dụng phiên bản dotnet không

Chỉ có một msbuild. dotnet CLI đang sử dụng msbuild:

Vì CLI sử dụng MSBuild làm công cụ xây dựng, chúng tôi khuyên bạn nên viết các phần này của công cụ dưới dạng mục tiêu và nhiệm vụ MSBuild tùy chỉnh, vì sau đó chúng có thể tham gia vào quá trình xây dựng tổng thể

https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility

Phiên bản cũ hơn của msbuildkhông hỗ trợ .NET Core. Có lẽ đó là phiên bản khác;)

Tôi đồng ý rằng nó khó hiểu, vì nó rất khác vài tháng trước.

3) dotnet cli là độc lập hay nó yêu cầu cài đặt msbuild ?. Ví dụ: khi bạn cài đặt dotnet SDK, cài đặt này cũng có msbuild? Nếu vậy điều này có khác với phiên bản được cài đặt với vs2017 không?

Tôi không chắc chắn về điều này, nhưng nó rất dễ kiểm tra. Tôi đã xóa tất cả msbuild.exe và nó vẫn hoạt động. Phát hiện ra nó đang sử dụng msbuild.dll trong thư mục SDK. ví dụ: "C: \ Program Files \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll"

Nếu bạn xóa cái đó, thì sẽ có bằng chứng:

Khi msbuild.dll bị loại bỏ

msbuild.dll thực sự là msbuild.exe, như bạn có thể thấy trong các thuộc tính:

Thuộc tính msbuild.dll của SDK 1.0.3

Một số mã

Nếu bạn nhìn vào mã của dotnet CLI, bạn có thể thấy nó đang tạo ra msbuildcác lệnh.

Ví dụ dotnet restore, được tạo bởi RestoreCommandlớp bên trong dotnet CLI .

Một phiên bản rút gọn:

public class RestoreCommand : MSBuildForwardingApp
{
    ...
    public static RestoreCommand FromArgs(string[] args, string msbuildPath = null)
    {
        var result = parser.ParseFrom("dotnet restore", args);
        ...
        var msbuildArgs = new List<string>
        {
            "/NoLogo",
            "/t:Restore",
            "/ConsoleLoggerParameters:Verbosity=Minimal"
        };
        ...
        return new RestoreCommand(msbuildArgs, msbuildPath);
    }

    public static int Run(string[] args)
    {
        RestoreCommand cmd;
        try
        {
            cmd = FromArgs(args);
        }
        catch (CommandCreationException e)
        {
            return e.ExitCode;
        }

        return cmd.Execute();
    }
    ...
}

Bạn có thể thấy dotnet restorechỉ là gọimsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


Nếu bạn kiểm tra RestoreCommandtrong thời giandotnet v1.0.0 RC2 , nó không sử dụng msbuildnhưng đang gọi nugettrực tiếp.

return NuGet3.Restore(args, quiet);

Ánh xạ giữa dotnetmsbuild

Tôi đã tạo một ánh xạ giữa dotnetmsbuild. Nó không hoàn chỉnh, nhưng các lệnh quan trọng ở đó.

Dotnet                 | Msbuild                                    | Remarks                         
-----------------------|--------------------------------------------|---------------------------------
Add                    |                                            |         
-----------------------|--------------------------------------------|---------------------------------                        
Build                  | /t:Build                                   |  
-----------------------|--------------------------------------------|---------------------------------                                
Build --no-incremental | /t:Rebuild                                 |    
-----------------------|--------------------------------------------|---------------------------------                              
Clean                  | /t:clean                                   |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Complete               |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Help                   |                                            | Help!                           
-----------------------|--------------------------------------------|--------------------------------- 
List                   |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Migrate                | -                                          |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Msbuild                |                                            | Forwarding all                  
-----------------------|--------------------------------------------|--------------------------------- 
New                    |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Nuget                  |                                            |  *
-----------------------|--------------------------------------------|--------------------------------- 
Pack                   | /t:pack                                    |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Publish                | /t:publish                                 |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Remove                 |                                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Restore                | /NoLogo /t:Restore                         |
                         /ConsoleLoggerParameters:Verbosity=Minimal |
-----------------------|--------------------------------------------|--------------------------------- 
Run                    | /nologo /verbosity:quiet                   |
                         /p:Configuration=   /p:TargetFramework     |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Sln                    |                                            | Not in msbuild                  
-----------------------|--------------------------------------------|--------------------------------- 
Store                  | /t:ComposeStore                            |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Test                   | /t:VSTest /v:quiet /nologo                 |                                 
-----------------------|--------------------------------------------|--------------------------------- 
Vstest                 |                                            | Forwarding to vstest.console.dll

*dotnet nuget: Thêm / xóa các gói vào csproj, cũng là một tập hợp giới hạn của nuget.exe, xem so sánh

PS không có bảng đánh dấu trong SO :(


msbuildkhông khôi phục các gói NuGet, vì vậy tôi không nghĩ rằng bạn có thể nói "cả hai đều tốt" mà không cần thêm một chút ngữ cảnh. Các bộ phận khác trông tốt.
Lex Li

5
msbuild /t:restorelà khôi phục mới. Hiển thị nó với mã. Đó là mới (như trước đây dotnetđã không sử dụng msbuild)
Julian

Câu trả lời tuyệt vời .. Tôi chỉ có một câu hỏi nữa (Tôi đã cập nhật câu hỏi gốc). Nếu bạn có thể trả lời rằng tôi nhiều sẽ đánh giá cao nó và sẽ chấp nhận câu trả lời của bạn
kimsagro

Câu hỏi hay. Tôi không chắc chắn và đã thử nghiệm nó. Kết luận: nó sử dụng msbuild.dll của riêng nó. Đã cập nhật bài đăng.
Julian
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.