本文告诉大家如何在项目文件通过不同的条件使用不同的方法运行
本文是 手把手教你写 Roslyn 修改编译 的文章,在阅读本文之前,希望已经知道了大多数关于 msbuild 的知识
为了告诉大家如何使用判断,需要创建一个简单的程序来写,这里创建一个 dotnet core 控制台项目,如果还没安装 dotnet core 可以到 dotnet sdk 2.1.300 winx64-CSDN下载
从 VisualStudio 安装文件夹打开开发人员工具命令行,打开这个是因为如果没有将 msbuild
加入到环境变量,就需要使用这个方法来调用 msbuild
调用 msbuild 的原因是为了编译可以看到输出。
在 Target
如果用 Message
的输出,除了设置为错误,其他的输出在 VisualStudio 的输出是无法看到的,只能通过 msbuild
才可以看到。
打开开发人员工具,先进入到刚才创建的项目所在的文件夹,然后执行msbuild
就可以看到输出
上面代码创建的是 RaskerYadeacorLalmi
项目,在这个项目所在的文件夹进行编译,这个项目是新创建的,只是在项目上写了下面代码
这是一个空白的Target
,一个Target
有一个 Name 和一个属性告诉在什么时候运行这个Target
在这个Target
里使用Message
,就可以在编译时看到下面代码
如果重新运行msbuild
会发现有很多都是跳过,具体请看每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 - walterlv
如果需要清理,重新编译,可以输入下面命令
现在可以尝试使用 Conditions
判断条件
使用 Conditions
很多时候都是使用字符串判断,如使用下面代码
因为TargetFramework
是 netcoreapp2.0
会运行这个 Target ,如果这时修改 TargetFramework
为 net45
就不会运行这个代码
如果需要同时判断多个条件,如在 Debug
而且是 net45
就运行,可以使用下面代码
注意在原来的$(Configuration)
是可以不使用引号,但是现在使用了|
就需要添加引号,表示这时字符串
实际的|
不是语法,可以换为其他的字符,如下面的代码
上面代码使用 '$(TargetFramework)-$(OutputType)'
判断
判断不相等
如果需要判断不相同,只需要修改==
为不相等
现在运行msbuild
可以看到输出了123
如果修改为'$(TargetFramework)'=='net45'
就判断不相等
判断大小
除了判断字符串,还可以判断字符串的大小,只能用来判断数值字符串,如果对于 16 进制的字符串,需要使用 0x
开始,如下面代码
因为使用的文件是 xml 所以需要将会>
转换为>
,将<
转为 >
如果输入的数值是16进制就需要使用 0x 放在开始,下面的代码就会出现下面的错误
判断文件存在
在条件判可以用 Exists
判断文件 文件夹是否存在
可以看到两个代码的不相同,使用 !
可以判断为 原来是相同的就返回false
,这里的 $(OutputPath)
是存在的,所以编译会输出下面代码
判断多个条件
除了使用开始的使用 -
等连接多个判断还可以使用 And
Or
来判断多个条件,如下面代码
同时判断存在输出的文件夹并且在测试下才运行
注意不能使用引号加上 And 如'And'
,这时 And
会作为字符串
如果使用多个条件,建议使用()
包括多个条件,如下面代码,同时进行多个判断
使用的范围
在很多地方都可以使用条件进行判断,如放在任意的PropertyGroup
里,如果判断为 false 就不会定义这个属性
也可以直接放在PropertyGroup
让整个PropertyGroup
不定义
同样可以放在 ItemGroup
里,也可以放在 ItemGroup
控制是否定义
还有上面写的 Target
也可以使用,在 Target
里也可以使用条件
还可以写在 Import
一般在 Import
都需要先判断是否存在文件
常用判断条件
请参阅 msbuild 项目文件常用判断条件
特别感谢 HaibaraAi 大佬的阅读
原文链接: http://blog.lindexi.com/post/Roslyn-%E5%9C%A8%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。