dotnet cli和新的vs2017 msbuild之间的关系

时间:2017-04-15 05:17:13

标签: msbuild visual-studio-2017 csproj dotnet-cli

随着从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安装的版本不同?

1 个答案:

答案 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。在我看来,dotnetmsbuild更容易使用,所以我更喜欢dotnet

为了更清楚,我在帖子的最后添加了msbuilddotnet之间的比较。

  

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”

如果删除那个,则有一个证据:

When msbuild.dll removed

msbuild.dll实际上是msbuild.exe,您可以在属性中看到:

msbuild.dll properties of SDK 1.0.3

一些代码

如果查看dotnet CLI的代码,可以看到它正在生成msbuild`命令。

例如dotnet restoreRestoreCommand 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);

dotnetmsbuild

之间的映射

我在dotnetmsbuild之间进行了映射。它不完整,但重要的命令就在那里。

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

PS no markdown tables in SO :(