dotnet cli与新vs2017 msbuild的关系
Posted
技术标签:
【中文标题】dotnet cli与新vs2017 msbuild的关系【英文标题】:Relationship between the dotnet cli and the new vs2017 msbuild 【发布时间】:2017-09-11 08:38:17 【问题描述】:随着从 project.json
到 VS2017 引入的新 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
中。这很麻烦,因为很多已经建立在 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 :(
【讨论】:
msbuild
不恢复 NuGet 包,所以我认为你不能在没有更多上下文的情况下说“两者都很好”。其他部分看起来不错。
msbuild /t:restore
是新的恢复。用代码显示它。它是新的(和以前一样,dotnet
不使用 msbuild)
很好的答案.. 我还有一个问题(我已经更新了原始问题)。如果您能回答,我将不胜感激并接受您的回答
好问题。我不确定并测试了它。结论:它使用自己的 msbuild.dll。更新了帖子。以上是关于dotnet cli与新vs2017 msbuild的关系的主要内容,如果未能解决你的问题,请参考以下文章
vs2017 js cordova + dotnet core 开发app
与 VS 2017 dotnet-sdk-2.1.4 和 .NET Core 2.0.6 .NET Core SDK 2.1.101 混淆
xUnit dotnet test CLi 输出到 NUnit xml 以便 Bamboo 可以读取结果
当与新的 Vue.js CLI Webpack 模板项目一起使用时,为啥 Webpack-Dev-Server(在 docker 容器内)不检测文件更改?