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

Relationship between the dotnet cli and the new vs2017 msbuild

随着从 project.json 到 VS2017 引入的新 csproj 格式的转变,我很难理解 dotnet cli 和新的 msbuild 以及何时使用一个而不是另一个。

1) 要从命令行构建新的 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 安装的版本不同吗?

问题

  1. To build a new csproj netstandard library from the command line, should I be calling the dotnet cli (for example dotnet restore dotnet build) or use msbuild (for example 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。在我看来,dotnetmsbuild好用,所以我更喜欢dotnet

为了更清楚,我在 post.

的末尾添加了 msbuilddotnet 的比较
  1. Also, my understanding is that there are two versions of msbuild, one built on the full framework and another targeting dotnet core. Is this correct? Should I always use the dotnet version

只有一个msbuild。 dotnet CLI 正在使用 msbuild:

Since CLI uses MSBuild as its build engine, we recommend that these parts of the tool be written as custom MSBuild targets and tasks, since they can then take part in the overall build process

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

msbuild 的旧版本缺少 .NET Core 支持。也许那是另一个版本 ;)

我同意这令人困惑,因为几个月前情况大不相同。

  1. Is dotnet cli standalone or does it require msbuild to be installed?. For instance when you install the dotnet SDK does this install msbuild as well? If so is this different to the version that is installed with vs2017?

我对此不确定,但它很容易测试。我已经删除了所有 msbuild.exe 并且它仍然有效。发现它正在使用 SDK 文件夹中的 msbuild.dll。 例如"C:\Program Files\dotnet\sdk.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);

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:Adding/removing 包到 csproj,也是有限集 nuget.exe,参见 comparison

PS no markdown tables in SO :(