随着从VS2017引入的project.json
转换为新的csproj
格式,我很难理解dotnet
cli和新msbuild
之间的区别何时使用一个而不是另一个。
1)要从命令行构建新的csproj
netstandard库,我应该调用dotnet
cli(例如dotnet restore
dotnet build
)还是使用{{ 1}}(例如msbuild
)。
2)另外,我的理解是msbuild ExampleNetstandard.sln
有两个版本,一个基于完整框架,另一个基于msbuild
。它是否正确?我是否应该始终使用dotnet core
3)dotnet version
是独立的,还是需要安装dotnet cli
?例如,当您安装dotnet SDK时,这也安装了msbuild吗?如果是这样与vs2017安装的版本不同?
答案 0 :(得分:87)
1)要从命令行构建新的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
并在dotnet
之上构建msbuild
。
dotnet
有一些不在msbuild
中的功能,例如dotnet new
。在我看来,dotnet
比msbuild
更容易使用,所以我更喜欢dotnet
。
为了更清楚,我在帖子的最后添加了msbuild
和dotnet
之间的比较。
2)另外,我的理解是有两个版本的msbuild,一个基于完整框架,另一个基于dotnet核心。它是否正确?我应该总是使用dotnet版本
只有一个msbuild。 dotnet CLI正在使用msbuild:
由于CLI使用MSBuild作为其构建引擎,因此我们建议将该工具的这些部分编写为自定义MSBuild目标和任务,因为它们可以参与整个构建过程
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
较旧版本的msbuild
缺少.NET Core支持。也许这是另一个版本;)
我同意这令人困惑,因为它在几个月前非常不同。
3)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
由RestoreCommand
class inside dotnet CLI创建。
剥离版本:
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
如果您选中RestoreCommand
in the time of dotnet v1.0.0 RC2
,则表明它没有使用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,请参阅comparison