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 dotnet
và 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 msbuild
không hoạt động tốt khi dotnet
xuất xưởng (ví dụ: Xamarin). Vì vậy, họ đã chuyển nội dung đến msbuild
và xây dựng dotnet
trên đầu trang msbuild
.
dotnet
có một số tính năng không có trong msbuild
, như dotnet new
. Theo tôi, dotnet
dễ 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 msbuild
và dotnet
ở 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 msbuild
khô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:
msbuild.dll thực sự là msbuild.exe, như bạn có thể thấy trong các thuộc tính:
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 msbuild
các lệnh.
Ví dụ dotnet restore
, được tạo bởi RestoreCommand
lớ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 restore
chỉ là gọimsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Nếu bạn kiểm tra RestoreCommand
trong thời giandotnet v1.0.0 RC2
, nó không sử dụng msbuild
nhưng đang gọi nuget
trực tiếp.
return NuGet3.Restore(args, quiet);
Ánh xạ giữa dotnet
vàmsbuild
Tôi đã tạo một ánh xạ giữa dotnet
và msbuild
. 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 :(
msbuild
khô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.