可以在不执行生成的情况下获取 MSBuild 项和属性的值。 当需要这些值作为所需生成过程的输入时,此选项非常有用,但需要评估项目以获取该值。
还可以为从生成的 MSBuild 目标返回的结果生成格式化输出。 在创作生成工具并且需要对特定目标的输出执行某些作时,这可能很有用。
使用命令行选项输出值
MSBuild 17.8 及更高版本中提供了以下命令行选项。
命令行选项 | DESCRIPTION |
---|---|
-getProperty:{propertyName,...} |
获取指定属性或属性的值。 |
-getItem:{itemName,...} |
获取指定项或项的值和关联的元数据。 |
-getTargetResult:{targetName,...} |
获取目标或目标的输出值。 |
如果不使用 -target
选项在命令行上指定目标,则 -getProperty
MSBuild 计算中的值和 -getItem
选项将返回值,并且不会生成任何目标。
-target
如果指定了该选项,则返回的属性或项值是在生成完成后返回的值,即在请求的所有目标都运行到完成之后。
如果指定 -getTargetResult
,则会自动生成所请求的任何目标,就像使用 -target
指定的目标一样,以及你请求的任何其他目标。
请注意,属性是在项之前计算的,因此,如果用于 -getProperty
引用项的属性,则根据项目评估前后是否获得结果,获得不同的输出。 例如,如果在不使用选项 -target
(或-getTargetResult
)的情况下使用-getProperty
,那么您将获得没有项计算的属性值。但如果指定-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 构建的评估和执行阶段。