MSBuild 中的 PropertyGroup、ItemGroup 和 ItemMetadata
在软件项目不断的进展中,MSBuild 脚本可能几个月都不会被修改,因为通常编译和发布的目录是不经常变化的。
但,一旦某天你需要修改了,看到那一堆 $(Something)、 @(Something)、%(Something) 是相当的头大,不得不搜索 MSDN 才能找到合理的用法。
每次看到下面这样的语法,我都感觉,有必要把语法设计成这样吗?
<Copy SourceFiles="@(SrcFiles)" DestinationFiles="@(SrcFiles->'c:\DestDir\%(RecursiveDir)%(Filename)%(Extension)')" />
这篇文章将对 PropertyGroup、ItemGroup 和 ItemMetadata 做简单的语法介绍,解救未来的自己。
PropertyGroup 和 $ 符号
PropertyGroup 用于标记一个或多个变量值。ProperyGroup 内的 XML 节点属性(Property)可以用任何字符串命名。
属性可以通过 $(OtherPropertyName) 语法来引用其他属性的的值。同样,在其他位置使用相同方式引用属性值。
<PropertyGroup>
<BaseFolder>C:\my\folder</BaseFolder>
<SettingsFile>$(BaseFolder)\settings\app.xml</SettingsFile>
</PropertyGroup>
<Message Text="Using settings file found at $(SettingsFile)"/>
上面的 Message 命令的输出结果为:
Using settings file found at C:\my\folder\settings\app.xml
ItemGroup 和 @ 符号
ItemGroup 用于标记一个包含多个值的变量,类似于 C# 中的 Array 或 Dictionary 等。
<ItemGroup>
<MyItems Include="First" />
<MyItems Include="Second;Third;" />
<MyItems Include=";;;;Fourth;;" />
</ItemGroup>
<Message Text="My items using dollar: $(MyItems)"/>
<Message Text="My items using at symbol: @(MyItems)"/>
上面的命令输出的结果为:
My items using dollar:
My items using at symbol: First;Second;Third;Fourth
我们看到,如果使用 $ 符号只能得到一个空字符串。而使用 @ 符号则将输出以 ";" 分号分割的字符串。
同时,MSBuild 也帮我们过滤了多余的 ";" 字符。
ItemMetadata 和 % 符号
ItemGroup 不但可以被用于列表数据,还可以用于 key/value 字典。
在 MSBuild 中 key/value 被称为 ItemMetadata。
<ItemGroup>
<People Include="Joe">
<Email>joe@example.com</Email>
</People>
<People Include="Bill">
<Email>bill@example.com</Email>
</People>
<People Include="Oscar">
<Email>oscar@example.com</Email>
</People>
</ItemGroup>
<Message Text="Processing person %(People.Identity) with email %(People.Email)"/>
上面的命令输出的结果为:
Processing person Joe with email joe@example.com
Processing person Bill with email bill@example.com
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
参考资料
- MSBuild Overview
- MSBuild Batching
- MSBuild Items
- MSBuild Tasks
- MSBuild Targets
- MSBuild Well-known Item Metadata
- Item Metadata in Task Batching
- Microsoft.Build.Tasks Namespace
- TaskExtension Class
- How to: Specify Which Target to Build First
MSBuild 中的 PropertyGroup、ItemGroup 和 ItemMetadata的更多相关文章
- 如何使用 MSBuild Target(Exec)中的控制台输出
我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程.但是,相比于 基于 Task 的方式,可控制的因素还是太少了. 有没有什么办法能够让 ...
- ILMerge在MSBuild与ILMerge在批处理文件中运行
ILMerge ILMerge是一个将多个.NET程序集合并到一个程序集中的实用程序.它可以免费使用,并以NuGet包的形式提供. 如果您在使用它时遇到任何问题,请与我们联系.(mbarnett at ...
- .NET魔法堂:工程构建基石->MSBuild
一.前言 MSBuild是一个既熟悉又陌生的名字,Visual Studio的项目加载和构建均通过MSBuild来实现.VS中右键打开项目菜单,对应MSBuild的Build目标,对应MSBuild的 ...
- Wix 安装部署(一)同MSBuild 自动生成打包文件
因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不同.我自己也在测试过程中,写下过程,以供参考.最新版本WiX Toolset v3.7,如何安装的就不说了, ...
- caffe中的props
VS .props解析 在VS 2010项目文件夹中属性表文件的新的格式(.props).Visual Studio 2010引入了用户设置文件(Microsoft.cpp.<Platfor ...
- MSBuild简单介绍
背景 托博客园的福,上周六,有家开发医疗行业系统的初创公司联系我,说在博客园上看到我关于WPF的几篇文章,邀请我去他们那里交流WPF相关的技术知识和心得体会.作为非大拿的我自然是受宠若惊,但对方好意相 ...
- Import 元素 (MSBuild)
Import 元素 (MSBuild) Visual Studio 2013 .NET Framework 4 .NET Framework 3 ...
- Wix 安装部署(一)同MSBuild 自动生成打包文件 转
原文地址:http://www.cnblogs.com/stoneniqiu/p/3355086.html 因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不 ...
- MSBuild是什么?
MSBuild入门 MSBuild是什么? MSBuild全称(Microsoft Build Engine),是用来生成.NET程序的平台.您可能不知道它,但是如果您在使用VS做开发,那么一定时时刻 ...
随机推荐
- 一点一滴学shell
1. 获取shell脚本的名称 ${BASH_SOURCE-$0} 2. 获取shell脚本的路径 dirname "${BASH_SOURCE-$0}" 这个路径不一定是脚本的真 ...
- 解决chrome和IE样式兼容问题
在页面title中加入: <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"> ...
- Rails中用CSV导出中文真心有技巧
require 'csv' class PartRequestsController < ApplicationController def render_csv_header(filename ...
- python基础第四天(1)
冒泡算法--算法 需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序 思路:相邻两个值进行比较,将较大的值放在右侧,依次比较! 第一步 li = [13, 22, 6, 99 ...
- Unity3D将来时:WebGL
作者:小玉链接:https://zhuanlan.zhihu.com/p/19974794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 随着Unity5.0的发布,W ...
- 深入理解HTTP协议
- selenium隔离环境安装、以及示例
1.virtual虚拟环境---分割项目---类似于创建文件夹---复制主环境 2.Python -n venv +目录 注意须在win环境下 3.激活虚拟环境 目录\Scripts\activate ...
- 广义Euler常数
对于区间(a,b)内f''(x)>0 那么在该区间内函数的一阶导数对应切线在该区间内只与f(x)在切点相交 1. f''(x)>0那么可知 f'(x)在该区间内是单调增的 以下图为例,过( ...
- CodeForces 743C Vladik and fractions (数论)
题意:给定n,求三个不同的数满足,2/n = 1/x + 1/y + 1/z. 析:首先1是没有解的,然后其他解都可以这样来表示 1/n, 1/(n+1), 1/(n*(n+1)),这三个解. 代码如 ...
- 使用PouchDB来实现React离线应用
最近听到有同学在讨论关于数据上传遇到离线的问题,因此在这里介绍一下PouchDB. PouchDB 是一个开源的javascript数据库,他的设计借鉴于Apache CouchDB,我们可以使用他来 ...