Relación entre dotnet cli y el nuevo vs2017 msbuild
Con el paso de project.json
al nuevo formato csproj
introducido con VS2017, me cuesta entender la diferencia entre la cli dotnet
y la nueva msbuild
y cuándo usar una sobre la otra.
1) Para construir una nueva biblioteca csproj
netstandard desde la línea de comandos, debería llamar a la cli dotnet
(por ejemplo dotnet restore
dotnet build
) o utilice msbuild
(por ejemplo msbuild ExampleNetstandard.sln
).
2) También, mi entendimiento es que hay dos versiones de msbuild
, una construida sobre el marco completo y otro objetivo dotnet core
. ¿Es correcto? ¿Debería usar siempre el dotnet version
3) Es dotnet cli
independiente o requiere msbuild
para ser instalado?. Por ejemplo, cuando instala el SDK dotnet, ¿también instala msbuild? Si es así, ¿es diferente a la versión que se instala con vs2017?
1 answers
Preguntas
1) Para construir una nueva biblioteca netstandard de csproj desde la línea de comandos, debería llamar a la cli de dotnet (por ejemplo dotnet restore dotnet build) o usar msbuild (por ejemplo msbuild ExampleNetstandard.sln).
Ambos funcionan bien, ya que actualmente dotnet
está construido sobre msbuild
. Así que es una cuestión de gustos. También puede llamar a tareas de msbuild utilizando la CLI de dotnet. (dotnet msbuild <msbuild_arguments>
)
Al principio, todas las cosas del núcleo. NET estaban solo en dotnet
y no en msbuild
. Esto era engorroso ya que muchas cosas que ya estaban construidas en msbuild
no funcionaban bien con dotnet
fuera de la caja (por ejemplo, Xamarin). Así que movieron las cosas a msbuild
y construyeron dotnet
encima de msbuild
.
dotnet
tiene algunas características que no están en msbuild
como dotnet new
. En mi opinión, dotnet
es más fácil de usar que msbuild
, así que prefiero dotnet
.
Para que sea más claro, he añadido una comparación entre msbuild
y dotnet
al final de mi post.
2) También, mi se entiende que hay dos versiones de msbuild, una construida en el marco completo y otra dirigida a dotnet core. ¿Es correcto? Debo usar siempre la versión dotnet
Solo hay un msbuild. dotnet CLI está usando msbuild:
Dado que CLI utiliza MSBuild como su motor de compilación, recomendamos que estas partes de la herramienta se escriban como objetivos y tareas personalizados de MSBuild, ya que pueden participar en la compilación general proceso
Https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
La versión anterior de msbuild
carecía del soporte.NET Core. Tal vez esa es la otra versión;)
Estoy de acuerdo en que es confuso, ya que era muy diferente hace unos meses.
3) ¿dotnet cli es independiente o requiere la instalación de msbuild?. Por ejemplo, cuando instala el SDK dotnet, ¿también instala msbuild? Si es así es esto diferente a la versión que se instala con vs2017?
No estaba seguro de esto, pero fue fácil de probar. He eliminado todos los msbuild.exe y todavía funcionó. Descubrí que está usando el msbuild.dll en la carpeta SDK. p. ej. "C:\Program Files\dotnet \ sdk \ 1.0.3 \ MSBuild.dll"
Si quitas esa, hay una prueba: {[40]]}
Msbuild.dll es en realidad msbuild.exe, como se puede ver en el propiedades:
Algún código
Si observa el código de la CLI de dotnet, puede ver que está generando comandos msbuild
`.
Por ejemplo dotnet restore
, es creado por el RestoreCommand
clase dentro de dotnet CLI.
Una versión despojada:
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();
}
...
}
Puedes ver que dotnet restore
está llamando a msbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Si comprueba RestoreCommand
en el tiempo de dotnet v1.0.0 RC2
, no estaba usando msbuild
pero estaba llamando nuget
directamente.
return NuGet3.Restore(args, quiet);
Mapeo entre dotnet
y msbuild
Hice un mapeo entre dotnet
y msbuild
. No está completo, pero los comandos importantes están ahí.
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: Adición / eliminación de paquetes a csproj, también conjunto limitado de nuget.exe, véase comparación
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 18:08:48