msbuild - prod - dotnet run
RelaciĆ³n entre el dotnet cli y el nuevo vs2017 msbuild (1)
Preguntas
1) Para construir una nueva biblioteca csproj netstandard desde la línea de comandos, debería llamar a dotnet cli (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
.
Entonces es cuestión de gustos.
También puede llamar a tareas de msbuild utilizando la CLI dotnet.
(
dotnet msbuild <msbuild_arguments>
)
Al principio, todo el núcleo de .NET estaba solo en
dotnet
y no en
msbuild
.
Esto fue engorroso ya que muchas cosas que ya estaban construidas en
msbuild
no funcionaban bien con
dotnet
fuera de la caja (por ejemplo, Xamarin).
Entonces 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 quede más claro, he agregado una comparación entre
msbuild
y
msbuild
al final de mi publicación.
2) Además, entiendo que hay dos versiones de msbuild, una construida en el marco completo y otra dirigida al núcleo dotnet. ¿Es esto correcto? ¿Debo usar siempre la versión dotnet?
Solo hay un msbuild. dotnet CLI está utilizando msbuild:
Dado que CLI usa MSBuild como su motor de compilación, recomendamos que estas partes de la herramienta se escriban como objetivos y tareas personalizadas de MSBuild, ya que pueden participar en el proceso de compilación general
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
La versión anterior de
msbuild
carecía del soporte de .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) ¿Es dotnet cli independiente o requiere msbuild para ser instalado? Por ejemplo, cuando instala el SDK dotnet, ¿esto también instala msbuild? Si es así, ¿es 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 msbuild.dll en la carpeta SDK. por ejemplo, "C: / Archivos de programa / dotnet / sdk / 1.0.3 / MSBuild.dll"
Si elimina esa, hay una prueba:
msbuild.dll es en realidad msbuild.exe, como puede ver en las propiedades:
Un poco de código
Si observa el código de la CLI dotnet, puede ver que está generando comandos
msbuild
.
Por ejemplo, la
dotnet restore
RestoreCommand
es creada por la
clase
RestoreCommand
dentro de la CLI
RestoreCommand
.
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();
}
...
}
Puede ver que
dotnet restore
solo está llamando a
msbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Si
RestoreCommand
en el momento de
dotnet v1.0.0 RC2
, no estaba usando
msbuild
sino que estaba llamando a
nuget
directamente.
return NuGet3.Restore(args, quiet);
Mapeo entre
msbuild
y
msbuild
Hice un mapeo entre
msbuild
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: Agregar / eliminar paquetes a csproj, también un conjunto limitado de nuget.exe, ver
comparison
Con el cambio de
project.json
al nuevo formato
csproj
introducido con VS2017, me cuesta entender la diferencia entre
dotnet
cli y el nuevo
msbuild
y cuándo usar uno sobre el otro.
1) Para construir una nueva biblioteca
csproj
netstandard desde la línea de comandos, debería llamar a
dotnet
cli (por ejemplo,
dotnet restore
dotnet build
) o usar
msbuild
(por ejemplo
msbuild ExampleNetstandard.sln
).
2) Además, entiendo que hay dos versiones de
msbuild
, una construida en el marco completo y otra dirigida al
dotnet core
.
¿Es esto correcto?
¿Debo usar siempre la
dotnet version
3) ¿Es
dotnet cli
independiente o requiere
msbuild
para ser instalado?
Por ejemplo, cuando instala el SDK dotnet, ¿esto también instala msbuild?
Si es así, ¿es diferente a la versión que se instala con vs2017?