dotnet CLI和新版vs2017 msbuild之间的关系


84

随着从VS2017引入project.json的新csproj格式的迁移,我努力了解dotnetcli和新格式之间的区别msbuild以及何时使用它们之间的区别。

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

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

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

Answers:


142

问题

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。这很麻烦,因为许多已经建立的东西在开箱即msbuilddotnet时不能很好地工作(例如Xamarin)。因此他们将内容移至msbuild并建立dotnetmsbuild

dotnet具有某些未提供的功能msbuild,如dotnet new。我认为,dotnet它比容易使用msbuild,所以我更喜欢dotnet

为了更加清楚,我在文章末尾添加了msbuild和之间的比较dotnet

2)另外,据我了解,msbuild有两个版本,一个基于完整框架,另一个针对dotnet核心。它是否正确?我应该一直使用dotnet版本吗

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

由于CLI使用MSBuild作为其构建引擎,因此我们建议将该工具的这些部分编写为自定义MSBuild目标和任务,因为它们随后可以参与整个构建过程

https://docs.microsoft.com/zh-cn/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.dll实际上是msbuild.exe:

SDK 1.0.3的msbuild.dll属性

一些代码

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

例如dotnet restore,是由RestoreCommanddotnet 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在的时间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的限制,请参见比较

PS在SO没有降价表:(


msbuild不会还原NuGet软件包,因此我认为如果没有更多上下文,您不能说“都很好”。其他部分看起来不错。
Lex Li

5
msbuild /t:restore是新的还原。用代码显示。它是新的(与以前一样dotnet使用msbuild)
朱利安(Julian

很好的答案..我只是还有一个问题(我已经更新了原始问题)。如果您能回答我将不胜感激,并且会接受您的回答
kimsagro

好问题。我不确定并对其进行了测试。结论:它使用了自己的msbuild.dll。更新了帖子。
朱利安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.