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과 함께 설치된 버전과 다른가요?

답변:


142

질문

1) 명령 줄에서 새 csproj netstandard 라이브러리를 빌드하려면 dotnet cli (예 : dotnet restore dotnet build)를 호출하거나 msbuild (예 : msbuild ExampleNetstandard.sln)를 사용해야합니다.

현재로 둘 다 잘 할 dotnet위에 구축된다 msbuild. 그래서 그것은 맛의 문제입니다. dotnet CLI를 사용하여 msbuild 작업을 호출 할 수도 있습니다. ( dotnet msbuild <msbuild_arguments>)

처음에는 모든 .NET 핵심 항목 dotnetmsbuild. 이미 구축 된 많은 항목이 즉시 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.dll은 속성에서 볼 수 있듯이 실제로 msbuild.exe입니다.

SDK 1.0.3의 msbuild.dll 속성

일부 코드

dotnet CLI의 코드를 살펴보면 msbuild명령을 생성하고 있음을 알 수 있습니다 .

예를 들어 dotnet restoreRestoreCommanddotnet 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에 마크 다운 테이블 없음 :(


msbuildNuGet 패키지를 복원하지 않으므로 약간의 컨텍스트 없이는 "둘 다 괜찮습니다"라고 말할 수 없다고 생각합니다. 다른 부분은 좋아 보입니다.
Lex Li

5
msbuild /t:restore새로운 복원입니다. 코드와 함께 보여주었습니다. 그것은 새로운 (이전 dotnet되었다 없습니다 사용은 MSBuild)
줄리안

훌륭한 답변 .. 질문이 하나 더 있습니다 (원래 질문을 업데이트했습니다). 당신은 내가 더 감사하겠습니다과 답변 받아 들일 것이라고 대답 할 수 있다면
kimsagro

좋은 질문. 나는 확실하지 않았고 그것을 테스트했습니다. 결론 : 자체 msbuild.dll을 사용합니다. 게시물을 업데이트했습니다.
Julian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.