질문
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
및 빌드 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 집합, 비교 참조
PS SO에 마크 다운 테이블 없음 :(
msbuild
NuGet 패키지를 복원하지 않으므로 약간의 컨텍스트 없이는 "둘 다 괜찮습니다"라고 말할 수 없다고 생각합니다. 다른 부분은 좋아 보입니다.