[英]Relationship between the dotnet cli and the new vs2017 msbuild
隨着從project.json
遷移到csproj
引入的新csproj
格式,我正在努力理解dotnet
cli 和新的msbuild
之間的區別,以及何時使用一個而不是另一個。
1) 要csproj
構建新的csproj
netstandard 庫,我應該調用dotnet
cli(例如dotnet restore
dotnet build
)還是使用msbuild
(例如msbuild ExampleNetstandard.sln
)。
2)另外,我的理解是msbuild
有兩個版本,一個建立在完整框架上,另一個針對dotnet core
。 這樣對嗎? 我應該總是使用dotnet version
3) dotnet cli
獨立的還是需要安裝msbuild
?。 例如,當您安裝 dotnet SDK 時,這是否也會安裝 msbuild? 如果是這樣,這與vs2017安裝的版本不同嗎?
- 要從命令行構建新的 csproj netstandard 庫,我應該調用 dotnet cli(例如 dotnet restore dotnet build)還是使用 msbuild(例如 msbuild ExampleNetstandard.sln)。
兩者都很好,因為目前dotnet
是建立在msbuild
之上的。 所以這是一個品味問題。 您還可以使用 dotnet CLI 調用 msbuild 任務。 ( dotnet msbuild <msbuild_arguments>
)
一開始,所有 .NET 核心內容僅在dotnet
,不在msbuild
。 這很麻煩,因為很多已經在msbuild
構建的東西在開箱即用的dotnet
(例如 Xamarin)上不能很好地工作。 所以他們將這些東西移到msbuild
並在msbuild
之上構建dotnet
。
dotnet
具有msbuild
中沒有的一些功能,例如dotnet new
。 在我看來, dotnet
比msbuild
更容易使用,所以我更喜歡dotnet
。
為了更清楚,我在文章末尾添加了msbuild
和dotnet
之間的比較。
- 另外,我的理解是 msbuild 有兩個版本,一個基於完整框架構建,另一個針對 dotnet 核心。 這樣對嗎? 我應該總是使用 dotnet 版本嗎
只有一個 msbuild。 dotnet CLI 正在使用 msbuild:
由於 CLI 使用 MSBuild 作為其構建引擎,我們建議將工具的這些部分編寫為自定義 MSBuild 目標和任務,因為它們可以參與整個構建過程
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
舊版本的msbuild
缺少 .NET Core 支持。 也許那是另一個版本;)
我同意這令人困惑,因為幾個月前情況非常不同。
- dotnet cli 是獨立的還是需要安裝 msbuild? 例如,當您安裝 dotnet SDK 時,這是否也會安裝 msbuild? 如果是這樣,這與vs2017安裝的版本不同嗎?
我不確定這一點,但它很容易測試。 我已經刪除了所有 msbuild.exe 並且它仍然有效。 發現它正在使用 SDK 文件夾中的 msbuild.dll。 例如“C:\\Program Files\\dotnet\\sdk\\1.0.3\\MSBuild.dll”
如果你刪除那個,有一個證明:
msbuild.dll 實際上是 msbuild.exe,您可以在屬性中看到:
如果您查看 dotnet CLI 的代碼,您可以看到它正在生成msbuild
命令。
例如dotnet restore
,由dotnet CLI 中的RestoreCommand
類創建。
精簡版:
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();
}
...
}
你可以看到dotnet restore
只是調用msbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
如果您在dotnet v1.0.0 RC2
時檢查RestoreCommand
,它沒有使用msbuild
而是直接調用nuget
。
return NuGet3.Restore(args, quiet);
dotnet
和msbuild
之間的映射我在dotnet
和msbuild
之間做了一個映射。 它不完整,但重要的命令在那里。
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:向 csproj 添加/刪除包,還有有限的 nuget.exe 集,請參閱比較
PS中沒有降價表:(
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.