dotnet cli 和新的 vs2017 msbuild 之间的关系
Relationship between the dotnet cli and the new vs2017 msbuild
随着从 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 安装的版本不同吗?
问题
- To build a new csproj netstandard library from the command line, should I be calling the dotnet cli (for example dotnet restore dotnet build) or use msbuild (for example 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
。
为了更清楚,我在 post.
的末尾添加了 msbuild
和 dotnet
的比较
- Also, my understanding is that there are two versions of msbuild, one built on the full framework and another targeting dotnet core. Is this correct? Should I always use the dotnet version
只有一个msbuild。 dotnet CLI 正在使用 msbuild:
Since CLI uses MSBuild as its build engine, we recommend that these parts of the tool be written as custom MSBuild targets and tasks, since they can then take part in the overall build process
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
msbuild
的旧版本缺少 .NET Core 支持。也许那是另一个版本 ;)
我同意这令人困惑,因为几个月前情况大不相同。
- Is dotnet cli standalone or does it require msbuild to be installed?. For instance when you install the dotnet SDK does this install msbuild as well? If so is this different to the version that is installed with vs2017?
我对此不确定,但它很容易测试。我已经删除了所有 msbuild.exe 并且它仍然有效。发现它正在使用 SDK 文件夹中的 msbuild.dll。
例如"C:\Program Files\dotnet\sdk.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:Adding/removing 包到 csproj,也是有限集 nuget.exe,参见 comparison
随着从 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 安装的版本不同吗?
问题
- To build a new csproj netstandard library from the command line, should I be calling the dotnet cli (for example dotnet restore dotnet build) or use msbuild (for example 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
。
为了更清楚,我在 post.
的末尾添加了msbuild
和 dotnet
的比较
- Also, my understanding is that there are two versions of msbuild, one built on the full framework and another targeting dotnet core. Is this correct? Should I always use the dotnet version
只有一个msbuild。 dotnet CLI 正在使用 msbuild:
Since CLI uses MSBuild as its build engine, we recommend that these parts of the tool be written as custom MSBuild targets and tasks, since they can then take part in the overall build process
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
msbuild
的旧版本缺少 .NET Core 支持。也许那是另一个版本 ;)
我同意这令人困惑,因为几个月前情况大不相同。
- Is dotnet cli standalone or does it require msbuild to be installed?. For instance when you install the dotnet SDK does this install msbuild as well? If so is this different to the version that is installed with vs2017?
我对此不确定,但它很容易测试。我已经删除了所有 msbuild.exe 并且它仍然有效。发现它正在使用 SDK 文件夹中的 msbuild.dll。 例如"C:\Program Files\dotnet\sdk.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:Adding/removing 包到 csproj,也是有限集 nuget.exe,参见 comparison