Evaluar elementos y propiedades y mostrar los resultados de los destinos

Puede obtener los valores que tendrían los elementos y propiedades de MSBuild sin ejecutar una compilación. Esta opción es útil cuando necesita estos valores como entradas para el proceso de compilación deseado, pero debe evaluar un proyecto para obtener el valor.

También puede generar una salida con formato para los resultados devueltos a partir de destinos de MSBuild compilados. Esto puede resultar útil en escenarios en los que está creando una herramienta de compilación y necesita hacer algo con las salidas de un destino determinado.

Usar opciones de línea de comandos para generar valores

Las siguientes opciones de línea de comandos están disponibles en MSBuild 17.8 y versiones posteriores.

Opción de línea de comandos Descripción
-getProperty:{propertyName,...} Obtiene el valor de la propiedad o propiedades especificadas.
-getItem:{itemName,...} Obtiene los valores y los metadatos asociados del elemento o elementos especificados.
-getTargetResult:{targetName,...} Obtiene los valores de salida del destino o de los destinos.

Si no especifica un destino en la línea de comandos mediante la opción -target, las opciones -getProperty y -getItem devuelven los valores de la evaluación de MSBuild y no se compila ningún destino. Si se especifica la opción -target, los valores de propiedad o elemento devueltos son los valores una vez finalizada la compilación, es decir, después de que todos los destinos solicitados se hayan ejecutado hasta su finalización.

Si especifica -getTargetResult, los destinos solicitados se compilan automáticamente, como si se especificaran con -target, junto con otros destinos solicitados.

Puede usar estos comandos con MSBuild.exe o con dotnet build, u otros comandos dotnet, como dotnet publish. Consulte Referencia de la línea de comandos de MSBuild y comando dotnet.

Si usa -getProperty para solicitar una sola propiedad, la salida se emite como una cadena de texto. Esto significa que puede consumir fácilmente el valor en escenarios de scripting o dentro de una línea de comandos más compleja.

Si usa -getProperty para solicitar varias propiedades, o usa -getItem o -getTargetResult, la salida está en un formato JSON. Los elementos se emiten con sus metadatos asociados.

Por ejemplo, el comando siguiente solicita dos propiedades, el elemento Compile y los resultados del destino Build:

msbuild ConsoleApp1.csproj -getProperty:TargetFramework,OutDir -getItem:Compile -getTargetResult:Build

El comando genera la siguiente salida JSON, con propiedades, elementos y resultados de destino agrupados en ese orden:

{
  "Properties": {
    "TargetFramework": "net6.0",
    "OutDir": "bin\\Debug\\net6.0\\"
  },
  "Items": {
    "Compile": [
      {
        "Identity": "Program.cs",
        "FullPath": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\Program.cs",
        "RootDir": "c:\\",
        "Filename": "Program",
        "Extension": ".cs",
        "RelativeDir": "",
        "Directory": "source\\repos\\ConsoleApp1\\ConsoleApp1\\",
        "RecursiveDir": "",
        "ModifiedTime": "2022-07-26 14:40:20.2657461",
        "CreatedTime": "2022-07-26 14:40:13.0808797",
        "AccessedTime": "2023-11-30 13:38:05.4556046",
        "DefiningProjectFullPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.Sdk.DefaultItems.props",
        "DefiningProjectDirectory": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\Sdks\\Microsoft.NET.Sdk\\targets\\",
        "DefiningProjectName": "Microsoft.NET.Sdk.DefaultItems",
        "DefiningProjectExtension": ".props"
      },
      {
        "Identity": "obj\\Debug\\net6.0\\ConsoleApp1.GlobalUsings.g.cs",
        "FullPath": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\ConsoleApp1.GlobalUsings.g.cs",
        "RootDir": "c:\\",
        "Filename": "ConsoleApp1.GlobalUsings.g",
        "Extension": ".cs",
        "RelativeDir": "obj\\Debug\\net6.0\\",
        "Directory": "source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\",
        "RecursiveDir": "",
        "ModifiedTime": "2022-07-26 14:40:30.6973207",
        "CreatedTime": "2022-07-26 14:40:30.6968276",
        "AccessedTime": "2023-11-30 13:38:05.4556046",
        "DefiningProjectFullPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.GenerateGlobalUsings.targets",
        "DefiningProjectDirectory": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\Sdks\\Microsoft.NET.Sdk\\targets\\",
        "DefiningProjectName": "Microsoft.NET.GenerateGlobalUsings",
        "DefiningProjectExtension": ".targets"
      },
      {
        "Identity": "obj\\Debug\\net6.0\\.NETCoreApp,Version=v6.0.AssemblyAttributes.cs",
        "FullPath": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\.NETCoreApp,Version=v6.0.AssemblyAttributes.cs",
        "RootDir": "c:\\",
        "Filename": ".NETCoreApp,Version=v6.0.AssemblyAttributes",
        "Extension": ".cs",
        "RelativeDir": "obj\\Debug\\net6.0\\",
        "Directory": "source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\",
        "RecursiveDir": "",
        "ModifiedTime": "2023-11-30 13:38:04.4893499",
        "CreatedTime": "2022-07-26 14:40:31.9799773",
        "AccessedTime": "2023-11-30 13:38:05.4556046",
        "DefiningProjectFullPath": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
        "DefiningProjectDirectory": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\MSBuild\\Current\\Bin\\amd64\\",
        "DefiningProjectName": "Microsoft.Common.CurrentVersion",
        "DefiningProjectExtension": ".targets"
      },
      {
        "Identity": "obj\\Debug\\net6.0\\ConsoleApp1.AssemblyInfo.cs",
        "FullPath": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\ConsoleApp1.AssemblyInfo.cs",
        "RootDir": "c:\\",
        "Filename": "ConsoleApp1.AssemblyInfo",
        "Extension": ".cs",
        "RelativeDir": "obj\\Debug\\net6.0\\",
        "Directory": "source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\",
        "RecursiveDir": "",
        "ModifiedTime": "2023-11-30 13:38:04.5569391",
        "CreatedTime": "2022-07-26 14:40:32.0372385",
        "AccessedTime": "2023-11-30 13:38:05.4556046",
        "DefiningProjectFullPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.GenerateAssemblyInfo.targets",
        "DefiningProjectDirectory": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\Sdks\\Microsoft.NET.Sdk\\targets\\",
        "DefiningProjectName": "Microsoft.NET.GenerateAssemblyInfo",
        "DefiningProjectExtension": ".targets"
      }
    ]
  },
  "TargetResults": {
    "Build": {
      "Result": "Success",
      "Items": [
        {
          "Identity": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\net6.0\\ConsoleApp1.dll",
          "TargetFrameworkIdentifier": ".NETCoreApp",
          "TargetPlatformMoniker": "",
          "CopyUpToDateMarker": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\ConsoleApp1.csproj.CopyComplete",
          "TargetPlatformIdentifier": "",
          "TargetFrameworkVersion": "6.0",
          "ReferenceAssembly": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\obj\\Debug\\net6.0\\ref\\ConsoleApp1.dll",
          "FullPath": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\net6.0\\ConsoleApp1.dll",
          "RootDir": "c:\\",
          "Filename": "ConsoleApp1",
          "Extension": ".dll",
          "RelativeDir": "c:\\source\\repos\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\net6.0\\",
          "Directory": "source\\repos\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\net6.0\\",
          "RecursiveDir": "",
          "ModifiedTime": "2023-11-30 13:38:06.5084339",
          "CreatedTime": "2023-11-30 13:38:06.9308716",
          "AccessedTime": "2023-11-30 13:38:06.9318732",
          "DefiningProjectFullPath": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
          "DefiningProjectDirectory": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\MSBuild\\Current\\Bin\\amd64\\",
          "DefiningProjectName": "Microsoft.Common.CurrentVersion",
          "DefiningProjectExtension": ".targets"
        }
      ]
    }
  }
}

Por supuesto, puede guardar la salida en un archivo en lugar de escribir en la consola redirigiendo la salida estándar mediante el símbolo >, tal como lo proporciona el shell.

Pasos siguientes

Las opciones de línea de comandos descritas aquí funcionan basándose en cómo MSBuild separa la fase de evaluación, en la que se asignan valores a las propiedades y elementos, y la fase de ejecución, en la que los objetivos se ejecutan y generan salidas. Obtenga más información sobre las fases de ejecución y evaluación de compilación de MSBuild en Cómo MSBuild compila proyectos.