您可以取得 MSBuild 項目和屬性的值,而不需要執行建置。 當您需要這些值做為所需建置程式的輸入時,此選項很有用,但您需要評估專案以取得值。
您也可以針對從建置的 MSBuild 目標傳回的結果產生格式化輸出。 在你編寫建置工具並可能需要對特定目標的輸出進行一些處理的情況下,這可能會很有幫助。
使用命令列選項輸出值
MSBuild 17.8 和更新版本中提供下列命令行選項。
命令行選項 | 說明 |
---|---|
-getProperty:{propertyName,...} |
取得指定屬性或屬性的值。 |
-getItem:{itemName,...} |
取得指定的項目或項目的數值和相關聯的元數據。 |
-getTargetResult:{targetName,...} |
取得目標或目標的輸出值。 |
如果您未使用 -target
選項在命令行上指定目標,則 -getProperty
和 -getItem
選項會從 MSBuild 評估傳回值,而且不會建置任何目標。
-target
如果指定了 選項,則傳回的屬性或專案值是建置完成後的值,也就是所有要求的目標都執行完成之後的值。
如果您指定 -getTargetResult
,任何要求的目標都會被自動建置,就像您使用 -target
指定它們一樣,以及任何您要求的其他目標。
請注意,屬性會在項目之前評估,因此如果您使用 -getProperty
作為一個參考項目的屬性,則根據您是在項目評估之前還是之後取得結果,會得到不同的輸出。 例如,如果您使用 -getProperty
而不使用 -target
選項(或 -getTargetResult
),則您會取得屬性值而不評估專案,但如果您指定 -targets
(或 -getTargetResult
),則會在專案評估之後取得最終結果。 請參閱 MSBuild 如何建置專案。
您可以使用這些指令搭配 MSBuild.exe
或搭配 dotnet build
,或其他 dotnet
命令,例如 dotnet publish
。 請參閱 MSBuild 命令行參考 和 dotnet 命令。
如果您使用 -getProperty
來要求單一屬性,輸出會以文字字串的形式發出。 這表示您可以在腳本場景中或在更複雜的指令行中輕鬆使用這些值。
如果您使用 -getProperty
來要求多個屬性,或使用 -getItem
或 -getTargetResult
,輸出會採用 JSON 格式。 項目會附上其相關的元數據進行發送。
例如,下列命令會要求兩個屬性:Compile
項目,以及從 Build
目標取得的結果。
msbuild ConsoleApp1.csproj -getProperty:TargetFramework,OutDir -getItem:Compile -getTargetResult:Build
此命令會產生下列 JSON 輸出,並以該順序分組屬性、專案和目標結果:
{
"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"
}
]
}
}
}
當然,您可以將標準輸出透過 shell 提供的符號 >
重新導向到檔案,而不是寫入主控台。
後續步驟
此處所述的命令行選項會根據 MSBuild 如何分隔評估階段(在此階段中屬性和專案被指派其值)以及執行階段(在此階段中目標運行並產生輸出)。 如需 MSBuild 建置評估和執行階段的詳細資訊,請參閱 MSBuild 如何建置專案。