Valutare elementi e proprietà e visualizzare i risultati delle destinazioni

È possibile ottenere i valori che gli elementi e le proprietà di MSBuild avrebbero senza eseguire una compilazione. Questa opzione è utile quando sono necessari questi valori come input per il processo di compilazione desiderato, ma è necessario valutare un progetto per ottenere il valore.

È anche possibile generare un output formattato per i risultati restituiti dalle destinazioni MSBuild compilate. Questo può essere utile negli scenari in cui si sta creando uno strumento di compilazione ed è necessario eseguire operazioni con gli output di una destinazione specifica.

Usare le opzioni della riga di comando per restituire i valori

Le opzioni della riga di comando seguenti sono disponibili in MSBuild 17.8 e versioni successive.

Opzione di riga di comando Descrizione
-getProperty:{propertyName,...} Ottiene il valore della proprietà o delle proprietà specificate.
-getItem:{itemName,...} Ottiene i valori e i metadati associati dell'elemento o degli elementi specificati.
-getTargetResult:{targetName,...} Ottenere i valori di output della destinazione o delle destinazioni.

Se non si specifica una destinazione nella riga di comando usando l'opzione -target , le -getProperty opzioni e -getItem restituiscono i valori della valutazione di MSBuild e non vengono compilate destinazioni. Se si specifica l'opzione -target , i valori della proprietà o dell'elemento restituiti sono i valori al termine della compilazione, ovvero dopo che tutte le destinazioni richieste sono state eseguite fino al completamento.

Se si specifica -getTargetResult, tutte le destinazioni richieste vengono compilate automaticamente, come se siano state specificate con -target, insieme alle altre destinazioni richieste.

È possibile usare questi comandi con o con MSBuild.exe o con dotnet buildaltri dotnet comandi, ad dotnet publishesempio . Vedere le informazioni di riferimento sulla riga di comando di MSBuild e il comando dotnet.

Se si usa -getProperty per richiedere una singola proprietà, l'output viene generato come stringa di testo. Ciò significa che è possibile usare facilmente il valore negli scenari di scripting o all'interno di una riga di comando più complessa.

Se si usa -getProperty per richiedere più proprietà o usare -getItem o -getTargetResult, l'output è in formato JSON. Gli elementi vengono generati con i metadati associati.

Ad esempio, il comando seguente richiede due proprietà, l'elemento Compile e i risultati dalla Build destinazione:

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

Il comando genera l'output JSON seguente, con proprietà, elementi e risultati di destinazione raggruppati in tale ordine:

{
  "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"
        }
      ]
    }
  }
}

Naturalmente, è possibile salvare l'output in un file invece di scrivere nella console reindirizzando l'output standard usando il > simbolo, come fornito dalla shell.

Passaggi successivi

Le opzioni della riga di comando descritte in questo articolo funzionano in base al modo in cui MSBuild separa la fase di valutazione, in cui le proprietà e gli elementi vengono assegnati i relativi valori e la fase di esecuzione, in cui le destinazioni vengono eseguite e producono output. Altre informazioni sulle fasi di valutazione ed esecuzione della compilazione di MSBuild sono disponibili in Come vengono compilati i progetti di MSBuild.