MSBuild 中的 PropertyGroup、ItemGroup 和 ItemMetadata

简介:

在软件项目不断的进展中,MSBuild 脚本可能几个月都不会被修改,因为通常编译和发布的目录是不经常变化的。

但,一旦某天你需要修改了,看到那一堆 $(Something)、 @(Something)、%(Something) 是相当的头大,不得不搜索 MSDN 才能找到合理的用法。

每次看到下面这样的语法,我都感觉,有必要把语法设计成这样吗?

1 <Copy SourceFiles="@(SrcFiles)" DestinationFiles="@(SrcFiles->'c:\DestDir\%(RecursiveDir)%(Filename)%(Extension)')" />

这篇文章将对 PropertyGroup、ItemGroup 和 ItemMetadata 做简单的语法介绍,解救未来的自己。

PropertyGroup 和 $ 符号

PropertyGroup 用于标记一个或多个变量值。ProperyGroup 内的 XML 节点属性(Property)可以用任何字符串命名。

属性可以通过 $(OtherPropertyName) 语法来引用其他属性的的值。同样,在其他位置使用相同方式引用属性值。

1 <PropertyGroup>
2   <BaseFolder>C:\my\folder</BaseFolder>
3   <SettingsFile>$(BaseFolder)\settings\app.xml</SettingsFile>
4 </PropertyGroup>
5 <Message Text="Using settings file found at $(SettingsFile)"/>

上面的 Message 命令的输出结果为:

1 Using settings file found at C:\my\folder\settings\app.xml

ItemGroup 和 @ 符号

ItemGroup 用于标记一个包含多个值的变量,类似于 C# 中的 Array 或 Dictionary 等。

复制代码
1 <ItemGroup>
2   <MyItems Include="First" />
3   <MyItems Include="Second;Third;" />
4   <MyItems Include=";;;;Fourth;;" />
5 </ItemGroup>
6 <Message Text="My items using dollar: $(MyItems)"/>
7 <Message Text="My items using at symbol: @(MyItems)"/>
复制代码

上面的命令输出的结果为:

1 My items using dollar:
2 My items using at symbol: First;Second;Third;Fourth

我们看到,如果使用 $ 符号只能得到一个空字符串。而使用 @ 符号则将输出以 ";" 分号分割的字符串。

同时,MSBuild 也帮我们过滤了多余的 ";" 字符。

ItemMetadata 和 % 符号

ItemGroup 不但可以被用于列表数据,还可以用于 key/value 字典。

在 MSBuild 中 key/value 被称为 ItemMetadata。

复制代码
 1 <ItemGroup>
 2   <People Include="Joe">
 3     <Email>joe@example.com</Email>
 4   </People>
 5   <People Include="Bill">
 6     <Email>bill@example.com</Email>
 7   </People>
 8   <People Include="Oscar">
 9     <Email>oscar@example.com</Email>
10   </People>
11 </ItemGroup>
12 <Message Text="Processing person %(People.Identity) with email %(People.Email)"/>
复制代码

上面的命令输出的结果为:

1 Processing person Joe with email joe@example.com
2 Processing person Bill with email bill@example.com
3 Processing person Oscar with email oscar@example.com

在 %(ItemGroup.MetadataKey) 语法中,"Identity" 代表着 XML 节点中的 "Include" 属性中的值。

同时,我们发现,虽然只写了一句 Message 命令,但是有 3 条输出。这是利用的 MSBuild 中的 Task Batching 功能。

那还有哪些 Item Metadata Key 呢?参考这里 :MSBuild Well-known Item Metadata

参考资料

 









本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/p/msbuild_propertygroup_itemgroup_itemmetadata.html,如需转载请自行联系原作者


目录
相关文章
|
消息中间件 缓存 NoSQL
Redis经典问题:缓存雪崩
本文介绍了Redis缓存雪崩问题及其解决方案。缓存雪崩是指大量缓存同一时间失效,导致请求涌入数据库,可能造成系统崩溃。解决方法包括:1) 使用Redis主从复制和哨兵机制提高高可用性;2) 结合本地ehcache缓存和Hystrix限流降级策略;3) 设置随机过期时间避免同一时刻大量缓存失效;4) 使用缓存标记策略,在标记失效时更新数据缓存;5) 实施多级缓存策略,如一级缓存失效时由二级缓存更新;6) 通过第三方插件如RocketMQ自动更新缓存。这些策略有助于保障系统的稳定运行。
1048 1
|
Java C++ C语言
UE4/5动画蓝图中Additive Animations讲解
UE4/5动画蓝图中Additive Animations讲解
888 0
UE4/5动画蓝图中Additive Animations讲解
|
11月前
|
Rust IDE Java
IDE和工具链配置指南
IDE和工具链配置指南
299 9
|
运维 NoSQL MongoDB
MongoDB有必要升级新版本吗?
如果你在 MongoDB 升级时需要协助,阿里云的专家还将为您提供升级规划建议,识别和缓解升级时可能出现的障碍、不兼容问题和潜在的性能问题。
3006 1
|
Nacos 开发者
nacos报错 Server check fail, please check server 127.0.0.1 ,port 9848 is available , error ={}
在配置文件中指定的Nacos服务器地址未被项目使用,程序仍尝试连接到127.0.0.1。开发者寻求帮助排查问题,已花费多天未果。
|
11月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
安全 物联网 API
API的科普
在当今这个数字化时代,信息如同血液般在无数个系统、应用和设备之间流淌,而这一切高效、无缝的交互背后,离不开一个至关重要的技术组件——API(Application Programming Interface,应用程序编程接口)。API作为数字世界的桥梁,不仅连接了不同的软件系统,还推动了数据共享、业务自动化以及创新服务的不断涌现。本文将深入探讨API的定义、作用、发展历程、关键技术、应用场景以及未来趋势,旨在揭示API在数字化转型中的核心价值和无限潜力。
1560 0
|
开发框架 .NET C#
如何判断一个 Dot Net 程序是 32 位还是 64 位?
如何判断一个 Dot Net 程序是 32 位还是 64 位?
|
存储 分布式计算 Hadoop
【大数据】分布式数据库HBase下载安装教程
【大数据】分布式数据库HBase下载安装教程
529 0
|
缓存 关系型数据库 MySQL
提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances
提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances
1571 0
提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances