2019-7-3-Roslyn-在项目文件使用条件判断
title | author | date | CreateTime | categories |
---|---|---|---|---|
Roslyn 在项目文件使用条件判断
|
lindexi
|
2019-7-3 17:7:32 +0800
|
2018-8-3 20:2:38 +0800
|
Roslyn MSBuild 编译器
|
本文告诉大家如何在项目文件通过不同的条件使用不同的方法运行
本文是 手把手教你写 Roslyn 修改编译 的文章,在阅读本文之前,希望已经知道了大多数关于 msbuild 的知识
为了告诉大家如何使用判断,需要创建一个简单的程序来写,这里创建一个 dotnet core 控制台项目,如果还没安装 dotnet core 可以到 dotnet sdk 2.1.300 winx64-CSDN下载
从 VisualStudio 安装文件夹打开开发人员工具命令行,打开这个是因为如果没有将 msbuild
加入到环境变量,就需要使用这个方法来调用 msbuild
调用 msbuild 的原因是为了编译可以看到输出。
在 Target
如果用 Message
的输出,除了设置为错误,其他的输出在 VisualStudio 的输出是无法看到的,只能通过 msbuild
才可以看到。
打开开发人员工具,先进入到刚才创建的项目所在的文件夹,然后执行msbuild
就可以看到输出
C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi>msbuild
用于 .NET Framework 的 Microsoft (R) 生成引擎版本 15.7.180.61344
版权所有(C) Microsoft Corporation。保留所有权利。 生成启动时间为 2018/8/3 20:05:47。
节点 1 上的项目“C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi\RaskerYadeacorLalmi.csproj”(默认目标)。
GenerateTargetFrameworkMonikerAttribute:
正在跳过目标“GenerateTargetFrameworkMonikerAttribute”,因为所有输出文件相对于输入文件而言都是最新的。
CoreGenerateAssemblyInfo:
正在跳过目标“CoreGenerateAssemblyInfo”,因为所有输出文件相对于输入文件而言都是最新的。
CoreCompile:
正在跳过目标“CoreCompile”,因为所有输出文件相对于输入文件而言都是最新的。
StanalurJikecair:
123
GenerateBuildDependencyFile:
正在跳过目标“GenerateBuildDependencyFile”,因为所有输出文件相对于输入文件而言都是最新的。
GenerateBuildRuntimeConfigurationFiles:
正在跳过目标“GenerateBuildRuntimeConfigurationFiles”,因为所有输出文件相对于输入文件而言都是最新的。
CopyFilesToOutputDirectory:
RaskerYadeacorLalmi -> C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi\bin\Debug\netcoreapp2.0\RaskerYadeac
orLalmi.dll
已完成生成项目“C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi\RaskerYadeacorLalmi.csproj”(默认目标)的操作。 已成功生成。
0 个警告
0 个错误
上面代码创建的是 RaskerYadeacorLalmi
项目,在这个项目所在的文件夹进行编译,这个项目是新创建的,只是在项目上写了下面代码
<Target Name="StanalurJikecair" AfterTargets="CoreCompile">
<Message Text="123"></Message>
</Target>
这是一个空白的Target
,一个Target
有一个 Name 和一个属性告诉在什么时候运行这个Target
在这个Target
里使用Message
,就可以在编译时看到下面代码
StanalurJikecair:
123
如果重新运行msbuild
会发现有很多都是跳过,具体请看每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 - walterlv
C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi>msbuild
用于 .NET Framework 的 Microsoft (R) 生成引擎版本 15.7.180.61344
版权所有(C) Microsoft Corporation。保留所有权利。 生成启动时间为 2018/8/3 20:05:47。
节点 1 上的项目“C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi\RaskerYadeacorLalmi.csproj”(默认目标)。
GenerateTargetFrameworkMonikerAttribute:
正在跳过目标“GenerateTargetFrameworkMonikerAttribute”,因为所有输出文件相对于输入文件而言都是最新的。
CoreGenerateAssemblyInfo:
正在跳过目标“CoreGenerateAssemblyInfo”,因为所有输出文件相对于输入文件而言都是最新的。
CoreCompile:
正在跳过目标“CoreCompile”,因为所有输出文件相对于输入文件而言都是最新的。
StanalurJikecair:
warning:123
GenerateBuildDependencyFile:
正在跳过目标“GenerateBuildDependencyFile”,因为所有输出文件相对于输入文件而言都是最新的。
GenerateBuildRuntimeConfigurationFiles:
正在跳过目标“GenerateBuildRuntimeConfigurationFiles”,因为所有输出文件相对于输入文件而言都是最新的。
CopyFilesToOutputDirectory:
RaskerYadeacorLalmi -> C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi\bin\Debug\netcoreapp2.0\RaskerYadeac
orLalmi.dll
已完成生成项目“C:\lindexi\github\RaskerYadeacorLalmi\RaskerYadeacorLalmi\RaskerYadeacorLalmi.csproj”(默认目标)的操作。 已成功生成。
0 个警告
0 个错误
如果需要清理,重新编译,可以输入下面命令
msbuild clean
现在可以尝试使用 Conditions
判断条件
使用 Conditions
很多时候都是使用字符串判断,如使用下面代码
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup> <Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="$(TargetFramework)=='netcoreapp2.0'">
<Message Text="123"></Message>
</Target>
因为TargetFramework
是 netcoreapp2.0
会运行这个 Target ,如果这时修改 TargetFramework
为 net45
就不会运行这个代码
<Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="$(TargetFramework)=='net45'">
<Message Text="123"></Message>
</Target>
如果需要同时判断多个条件,如在 Debug
而且是 net45
就运行,可以使用下面代码
<Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="'$(Configuration)|$(TargetFramework)'=='DEBUG|net45'">
<Message Text="123"></Message>
</Target>
注意在原来的$(Configuration)
是可以不使用引号,但是现在使用了|
就需要添加引号,表示这时字符串
实际的|
不是语法,可以换为其他的字符,如下面的代码
<Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="'$(TargetFramework)-$(OutputType)'=='netcoreapp2.0-Exe'">
<Message Text="123"></Message>
</Target>
上面代码使用 '$(TargetFramework)-$(OutputType)'
判断
判断不相等
如果需要判断不相同,只需要修改==
为不相等
<Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="'$(TargetFramework)'!='net45'">
<Message Text="123"></Message>
</Target>
现在运行msbuild
可以看到输出了123
如果修改为'$(TargetFramework)'=='net45'
就判断不相等
判断大小
除了判断字符串,还可以判断字符串的大小,只能用来判断数值字符串,如果对于 16 进制的字符串,需要使用 0x
开始,如下面代码
<Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="'60'>'10'">
<Message Text="因为60大于10所以会运行"></Message>
</Target> <Target Name="LamaciswhaJoopisJerall" AfterTargets="CoreCompile" Condition="'60'>='60'">
<Message Text="因为60大于60所以会运行"></Message>
</Target> <Target Name="TasyenatarReresetelRagearsu" AfterTargets="CoreCompile" Condition="'10' < '60'">
<Message Text="因为10小于60所以会运行"></Message>
</Target> <Target Name="FurkeeneLafer" AfterTargets="CoreCompile" Condition="'60'<='60'">
<Message Text="因为60小于等于60所以会运行"></Message>
</Target> <Target Name="JoudewalljeeZeargeaday" AfterTargets="CoreCompile" Condition="'0xAA'>'10'">
<Message Text="如果使用16进制需要使用0x放在字符串最前"></Message>
</Target>
因为使用的文件是 xml 所以需要将会>
转换为>
,将<
转为 >
如果输入的数值是16进制就需要使用 0x 放在开始,下面的代码就会出现下面的错误
<Target Name="SiscooLecem" AfterTargets="CoreCompile" Condition="'AA'>'10'">
<Message Text="如果使用16进制需要使用0x放在字符串最前"></Message>
</Target>
error MSB4086: 尝试在条件“'AA
'>'10'”中对计算结果为“AA”而不是数字的“AA”进行数值比较
判断文件存在
在条件判可以用 Exists
判断文件 文件夹是否存在
<Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="Exists('$(OutputPath)')">
<Message Text="$(OutputPath)"></Message>
</Target> <Target Name="ZurwelSowselnu" AfterTargets="CoreCompile" Condition="!Exists('$(OutputPath)')">
<Message Text="$(OutputPath)"></Message>
</Target>
可以看到两个代码的不相同,使用 !
可以判断为 原来是相同的就返回false
,这里的 $(OutputPath)
是存在的,所以编译会输出下面代码
StanalurJikecair:
bin\Debug\netcoreapp2.0\
判断多个条件
除了使用开始的使用 -
等连接多个判断还可以使用 And
Or
来判断多个条件,如下面代码
<Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="Exists('$(OutputPath)') And $(Configuration)=='Debug'">
<Message Text="$(OutputPath)"></Message>
</Target>
同时判断存在输出的文件夹并且在测试下才运行
注意不能使用引号加上 And 如'And'
,这时 And
会作为字符串
如果使用多个条件,建议使用()
包括多个条件,如下面代码,同时进行多个判断
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<Foo>123</Foo>
</PropertyGroup> <Target Name="StanalurJikecair" AfterTargets="CoreCompile" Condition="(Exists('$(OutputPath)') And $(Configuration)=='Debug') or ($(Foo)=='123')">
<Message Text="$(OutputPath)"></Message>
</Target>
使用的范围
在很多地方都可以使用条件进行判断,如放在任意的PropertyGroup
里,如果判断为 false 就不会定义这个属性
<PropertyGroup>
<OutputType Condition="'德熙' == '逗比'">Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
也可以直接放在PropertyGroup
让整个PropertyGroup
不定义
<PropertyGroup Condition="'德熙' == '逗比'">
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
同样可以放在 ItemGroup
里,也可以放在 ItemGroup
控制是否定义
<ItemGroup>
<Foo Condition="'德熙' == '逗比'" Include="123"></Foo>
</ItemGroup>
<ItemGroup Condition="'德熙' == '逗比'">
<Foo Include="123"></Foo>
</ItemGroup>
还有上面写的 Target
也可以使用,在 Target
里也可以使用条件
<Target Name="StanalurJikecair" AfterTargets="CoreCompile">
<Message Condition="'德熙' == '逗比'" Text="$(OutputPath)"></Message>
</Target>
还可以写在 Import
一般在 Import
都需要先判断是否存在文件
<Import Condition="Exists('../lindexi.txt')" Project="../lindexi.txt"></Import>
特别感谢 HaibaraAi 大佬的阅读
2019-7-3-Roslyn-在项目文件使用条件判断的更多相关文章
- Ansible Playbook 使用条件判断语句
先介绍一下 gather_facts 参数,该参数用于指定在执行任务前,是否先执行 setup 模块获取主机相关信息,以便给后面的任务使用 [root@localhost ~]# ansible 19 ...
- Thymeleaf常用语法:条件判断 if、switch case
if语句条件判断使用th:if,它会判断表达式是否成立,表达式的结果支持boolean.number.character.String及其他类型.满足下面情况,if语句成立:(1) 表达式的结果是数字 ...
- Linux shell if条件判断2
前面介绍linux shell的if判断的语法,现在再补充一点. Linux shell if条件判断1 分支判断结构 if , case 下面两个结构语法,已经在前面有过示例. 结构1: ...
- RF之条件判断、初始化清除-4
条件判断: rf中用run keyword if 关键字做条件判断,以此来达到类似在python中if ...else...条件判断的功能. 注意:ELSE IF一定都是大写的,不然运行 ...
- Java学习之==>条件判断、循环控制
一.条件判断 1.if-else 示例: /** * 第1种,1个分支 */ public void case1() { int age = 15; if (age > 18) { System ...
- C# if中连续几个条件判断
C# if中连续几个条件判断 1.if (条件表达式1 && 条件表达式2) 当条件表达式1为true时 using System; using System.Collections. ...
- js条件判断时隐式类型转换
Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...
- 5-3 bash脚本编程之二 条件判断
1. 条件测试的表达式 1. [ expression ] :注意这个中括号的前后都有一个空格 2. [[ expression ]] 3. test expression 2.条件判断的类型 1. ...
- 第10章 Shell编程(3)_字符处理命令和条件判断
3. 字符处理命令 3.1 排序命令:sort (1)sort命令:#sort [选项] 文件名 选项 作用 -f 忽略大小写 -n 以数值型进行排序,默认使用字符串型排序 -r 反向排序 -t 指定 ...
随机推荐
- hexo next博客之无敌之舒服之美妙之轻松之发布博客(mweb,github自主开发插件)
文章目录 **前言:** 具体用法 **mweb for mac** 注意 **github插件下载** 个人博客:https://mmmmmm.me 源码:https://github.com/da ...
- C++——代码风格
google代码风格 1.使用安全的分配器(allocator),如scoped_ptr,scoped_array 2.测试用的,其他的不能用: 2.1 友元 2.2 C++异常 2.3 RTTI 3 ...
- hibernate 中createQuery与createSQLQuery两者区别
hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对象装入list返回, ...
- JUC源码分析-集合篇(四)CopyOnWriteArrayList
JUC源码分析-集合篇(四)CopyOnWriteArrayList Copy-On-Write 简称 COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想 ...
- js 中typeof 检测数据类型的时候需要注意的小细节
博客搬迁给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/10/26/typeof-%E6%A3%80%E6%B5%8B%E6%95%B0%E6%8D% ...
- Promise 的深度学习
1.Promise 是什么? Promise 是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大.Promise ,简单说就是一个容器,里面保存着某个未来才回结束的事件(通常 ...
- vimtutor - Vim 教程
总览 (SYNOPSIS) vimtutor 描述 (DESCRIPTION) Vimtutor 打开 Vim 教程. 它首先 考备 文件, 这样 就可以 在 不改变 原文件 的情况下 修改 当前文件 ...
- python_django__验证码
验证码:在用户注册/登陆时使用,为了防止暴力请求,减轻服务器压力,也是防止csrf的一种方式. 运行环境:python django 对应template模块htm函数: 登陆页面: <!DOC ...
- Python自学:第五章 动手试一试 4-3
# -*- coding: GBK -*- numbers = ['] for number in numbers: print(number) 输出为: 1 2 3 4 5 6 7 8 9 10 1 ...
- Spring Cloud (Spring Cloud Stream)解析
执行脚本目录 /bin windows 在其单独的目录 快速上手 下载并且解压kafka压缩包 运行服务 以Windows为例,首先打开cmd: 1. 启动zookeeper: bin\window ...