问题
- 要从命令行构建新的 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。在我看来,dotnet 比msbuild 更容易使用,所以我更喜欢dotnet。
为了更清楚,我在帖子末尾添加了msbuild 和dotnet 之间的比较。
- 另外,我的理解是 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);
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 集,请参阅 comparison
PSno markdown tables in SO :(