dotnet cli与新vs2017 msbuild的关系

Posted

技术标签:

【中文标题】dotnet cli与新vs2017 msbuild的关系【英文标题】:Relationship between the dotnet cli and the new vs2017 msbuild 【发布时间】:2017-09-11 08:38:17 【问题描述】:

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

1) 要从命令行构建一个新的csproj netstandard 库,我应该调用dotnet cli(例如dotnet restoredotnet build)还是使用msbuild(例如msbuild ExampleNetstandard.sln) .

2) 另外,我的理解是msbuild 有两个版本,一个基于完整框架构建,另一个针对dotnet core。它是否正确?我应该一直使用dotnet version

3) dotnet cli 是独立的还是需要安装 msbuild?例如,当您安装 dotnet SDK 时,这是否也会安装 msbuild?如果是这样,这与使用 vs2017 安装的版本不同吗?

【问题讨论】:

【参考方案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,并在msbuild 之上构建了dotnet

dotnet 具有msbuild 中没有的一些功能,例如dotnet new。在我看来,dotnetmsbuild 更容易使用,所以我更喜欢dotnet

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

    另外,我的理解是 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,由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:向 csproj 添加/删除包,同样是有限的 nuget.exe 集,请参阅 comparison

PSno markdown tables in SO :(

【讨论】:

msbuild 不恢复 NuGet 包,所以我认为你不能在没有更多上下文的情况下说“两者都很好”。其他部分看起来不错。 msbuild /t:restore 是新的恢复。用代码显示它。它是新的(和以前一样,dotnet使用 msbuild) 很好的答案.. 我还有一个问题(我已经更新了原始问题)。如果您能回答,我将不胜感激并接受您的回答 好问题。我不确定并测试了它。结论:它使用自己的 msbuild.dll。更新了帖子。

以上是关于dotnet cli与新vs2017 msbuild的关系的主要内容,如果未能解决你的问题,请参考以下文章

vs2017 js cordova + dotnet core 开发app

与 VS 2017 dotnet-sdk-2.1.4 和 .NET Core 2.0.6 .NET Core SDK 2.1.101 混淆

vs2017 对dockerfile的支持

xUnit dotnet test CLi 输出到 NUnit xml 以便 Bamboo 可以读取结果

当与新的 Vue.js CLI Webpack 模板项目一起使用时,为啥 Webpack-Dev-Server(在 docker 容器内)不检测文件更改?

ServiceStack NetCoreAppSettings 配置文件读取和设置