当前位置: 首页 > news >正文

MSBuild 如何编写带条件的属性、集合和任务 Condition?

在项目文件 csproj 中,通过编写带条件的属性(PropertyGroup)、集合(ItemGroup)和任务(Target)可以完成更加复杂的项目文件的功能。

本文介绍如何编写带条件的 MSBuild 项。


本文内容

    • Condition
    • 单引号
    • `==` 和 `!=`
    • `<`, `>`, `<=`, `>=`
    • `Exists`, `HasTrailingSlash`
    • 与或非:`And`, `Or`, `!`
    • 组合:`()`
    • if 条件:`$if$`

Condition

如果要给你的 MSBuild 项附加条件,那么加上 Condition 特性即可。

Condition 可以写在任何地方,例如 PropertyGroupItemGroupTarget 或者内部的一个属性或一个项或者一个任务等。

下面这段代码表示在 Debug 配置下计算一个属性的值,而这个逗比属性 DoubiNames 的属性仅在此属性从未被指定过值的时候赋一个值 吕毅

<Project>
    <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
        <DoubiNames Condition=" '$(DoubiNames)' == '' ">吕毅</DoubiNames>
    </PropertyGroup>
</Project>

在单引号的前后,等号这些运算符的前后空格可加可不加,没有影响。

单引号

在上面的例子中,我们给条件中的所有字符串加上了包裹的单引号。

单引号对于简单的字母数字字符串是不必要的,对于布尔值来说也是不必要的。但是,对于空值来说,是必须加上的,即 ''

==!=

== 符号左右两侧的字符串如果相等,则返回 true,否则返回 false

!= 符号左右两侧的字符串如果相等,则返回 false,否则返回 true

Condition=" $(Configuration) == 'Debug' "

<, >, <=, >=

用于比较数值上的大小关系。当然,在项目文件中,用于表示数值的字符串在此操作符下表示的就是数值。

  1. 左右两侧比较的字符串必须是表示数值的字符串,例如 123 或者 0x7b
  2. 只能是十进制或者十六进制字符串,而十六进制字符串必须以 0x 开头;
  3. 由于此比较是写在 XML 文件中的,所以必须转义,即 < 需要写成 &lt;> 需要写成 &gt;

Exists, HasTrailingSlash

Exists 判断文件或者文件夹是否存在。存在则返回 true,否则返回 false

Condition=" Exists('Foo\walterlv.config') "
Condition=" Exists('Foo\WalterlvFolder') "
Condition=" Exists('$(WalterlvFile)') "

HasTrailingSlash 如果字符串的尾部包含 / 或者 \ 字符串,则返回 true,否则返回 false

Condition="!HasTrailingSlash($(OutputPath))"

与或非:And, Or, !

就是计算机中常见的与或非的机制。

<DoubiNames Condition=" '$(DoubiNames)' == '吕毅' Or '$(DoubiNames)' == '林德熙' ">组队逗比</DoubiNames>

组合:()

就是计算机中通常用于修改运算优先级的括号,这可以先计算括号内的布尔结果。

if 条件:$if$

Condition=" $if$ ( %expression% ), $else$, $endif$ "

参考资料

  • MSBuild Conditions - Visual Studio - Microsoft Docs
  • Visual Studio Project/Item Template Parameter Logic - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
  • 如何快速自定义 Visual Studio 中部分功能的快捷键
  • C# 8.0 如何在项目中开启可空引用类型的支持
  • C# 8.0 可空引用类型中的各项警告/错误的含义和示例代码
  • C# 可空引用类型 NullableReferenceTypes 更强制的约束:将警告改为错误 WarningsAsErrors
  • ClearType 的原理:Windows 上文本的亚像素控制
  • 使用 7-Zip 的命令行版本来压缩和解压文件
  • 在项目文件 csproj 中或者 MSBuild 的 Target 中使用 % 引用集合中每一项的属性
  • MSBuild 中的特殊字符($ @ % 等):含义、用法以及转义
  • WPF 获取元素(Visual)相对于屏幕设备的缩放比例,可用于清晰显示图片
  • Visual Studio 通过修改项目的调试配置文件做到临时调试的时候不要编译(解决大项目编译缓慢问题)
  • 使用 dotnet 命令行配合 vscode 完成一个完整 .NET 解决方案的编写和调试
  • 如何修改 Visual Studio 新建项目时的默认路径
  • 使用 EnumWindows 找到满足你要求的窗口
  • WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?
  • 收藏网友的 源程序下载网
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 30天自制操作系统-2
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • export和import的用法总结
  • Facebook AccountKit 接入的坑点
  • Go 语言编译器的 //go: 详解
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • React+TypeScript入门
  • Spark RDD学习: aggregate函数
  • Swift 中的尾递归和蹦床
  • vue自定义指令实现v-tap插件
  • Yeoman_Bower_Grunt
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聊聊redis的数据结构的应用
  • 前端工程化(Gulp、Webpack)-webpack
  • 思考 CSS 架构
  • 用Python写一份独特的元宵节祝福
  • 原生Ajax
  • 2017年360最后一道编程题
  • Java总结 - String - 这篇请使劲喷我
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #{} 和 ${}区别
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (31)对象的克隆
  • (52)只出现一次的数字III
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Forward) Music Player: From UI Proposal to Code
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)正点原子I.MX6ULL u-boot移植
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)SpringBoot3---尚硅谷总结
  • (转)Linux下编译安装log4cxx
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题