dotnet cli와 새로운 vs2017 msbuild 간의 관계
VS2017에 도입 project.json
된 새로운 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) 명령 줄에서 새 csproj netstandard 라이브러리를 빌드하려면 dotnet cli (예 : dotnet restore dotnet build)를 호출하거나 msbuild (예 : msbuild ExampleNetstandard.sln)를 사용해야합니다.
현재로 둘 다 잘 할 dotnet
위에 구축된다 msbuild
. 그래서 그것은 맛의 문제입니다. dotnet CLI를 사용하여 msbuild 작업을 호출 할 수도 있습니다. ( dotnet msbuild <msbuild_arguments>
)
처음에는 모든 .NET 핵심 항목 dotnet
이 msbuild
. 이미 구축 된 많은 것들이 바로 사용할 수 있는 기능 (예 : Xamarin) msbuild
이 제대로 작동하지 않았기 때문에 이것은 번거 롭습니다 dotnet
. 그래서 그들은에 물건을 이동 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.exe입니다.
일부 코드
dotnet CLI의 코드를 살펴보면 msbuild
명령을 생성하고 있음을 알 수 있습니다 .
예를 들어 dotnet restore
는 RestoreCommand
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
의 시간에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 집합, 비교 참조
'Programing' 카테고리의 다른 글
D3 차트의 레이블에 줄 바꿈을 어떻게 포함합니까? (0) | 2020.11.28 |
---|---|
C 대 C ++ 구조체 정렬 (0) | 2020.11.28 |
ELMAH를 사용하는 WCF 서비스에 대한 예외 로깅 (0) | 2020.11.28 |
데이터베이스 호출에 대한 단위 테스트를 작성하는 방법 (0) | 2020.11.28 |
Scala 및 Haskell 유형 시스템의 차이점과 유사점은 무엇입니까? (0) | 2020.11.28 |