2019-11-29-Roslyn-使用-Directory.Build.props-文件定义编译
title | author | date | CreateTime | categories |
---|---|---|---|---|
Roslyn 使用 Directory.Build.props 文件定义编译
|
lindexi
|
2019-11-29 08:58:55 +0800
|
2018-7-18 12:18:9 +0800
|
Roslyn MSBuild 编译器
|
本文告诉大家 Directory.Build.props 是什么有什么优点?如何使用 Directory.Build.props 文件定义编译
在 MSBuild 的 15 之后,也就是安装了 VisualStudio 2017 就可以使用的新功能,支持新的 csproj 格式。如何把以前的格式升级为 VisualStudio 2017 的新格式请看从以前的项目格式迁移到 VS2017 新项目格式
在 MSBuild 15 的一个新的功能就是让开发者可以自己定义项目信息放在一个文件,这个文件会在 Microsoft.Common.props
引用,而且会在csproj
项目文件所在的文件夹开始寻找,只要找到存在Directory.Build.props
文件就会自动导入里面的内容。
除了定义Directory.Build.props
之外,还可以定义 Directory.Build.targets
文件,不同的只是这个文件是在 Microsoft.Common.targets
使用。
入门
最简单的方法是在 Directory.Build.props
定义一个随意的值,通过这个值可以用来处理多个项目引用相同的版本。例如我有 3 个不同的项目,我需要把这三个项目打包,但是我需要让这三个项目的版本保持一样,这时需要怎么做?
最简单的方法是我在每个项目的项目文件里面写版本,但是我有3个项目,每次修改版本就需要修改三个文件,这样的写法感觉一点都不好。
如果我有 100 个项目,那么我一定也不想去修改。所以下面来告诉使用Directory.Build.props
定义版本。
虽然上面说了很多东西,但是不要忘了,还没有创建3个项目。
首先打开宇宙第一IDE某个在i7固态打开需要10分钟的工具,使用随意的变量做3个项目
通过上面的方式创建 3 个项目 GeajoYabaFarcho,SeepoHairsarsawjoo,KawkasDrurxere现在项目可以右击打包
可以看到现在打包的版本是 1.0 ,随意打开一个项目的文件,可以看到还没指定版本
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup> </Project>
现在可以尝试添加 Directory.Build.props
文件,在 sln 文件所在的文件夹创建文件,请看下图
创建的 Directory.Build.props
文件只需要写很少的代码
<Project>
<PropertyGroup>
<Version>1.2.0</Version>
</PropertyGroup>
</Project>
现在才是在三个项目右击打包,可以在对应的 bin\Debug\
的文件夹找到下面的文件
GeajoYabaFarcho.1.2.0.nupkg
KawkasDrurxere.1.2.0.nupkg
SeepoHairsarsawjoo.1.2.0.nupkg
在需要修改版本号的时候就只需要修改 Directory.Build.props
文件版本
好处
可以提供多个项目使用统一的设置,如上面提高的修改版本号。或者统一的输出文件夹,上面有3个项目,打包的时候是输出到3个不同的文件夹,能不能都输出到相同的文件夹?使用 Directory.Build.props
可以指定所有项目相同的输出文件夹。
怎么做呢?肯定我会这里告诉大家,不然会被打的
打开 Directory.Build.props
在里面添加下面代码
<Project>
<PropertyGroup>
<Version>1.2.0</Version>
<OutputPath>$(MSBuildThisFileDirectory)bin\$(Configuration)\</OutputPath>
</PropertyGroup>
</Project>
如果真的有看上面的代码,就会看到实际上添加的代码只有下面一句
<OutputPath>$(MSBuildThisFileDirectory)bin\$(Configuration)\</OutputPath>
这里的$(MSBuildThisFileDirectory)
就是获得当前文件所在的文件夹,也就是Directory.Build.props
所在文件夹的bin
文件夹
更多关于编译变量请看项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv
不同的项目之间可以通过快速复制Directory.Build.props
的方法统一配置,很经常我在写的时候需要打包 nuget 就需要很多常用的属性,如
<Authors>lindexi</Authors>
现在可以把这个代码写在 Directory.Build.props
放在最外层,这样创建一个新的项目可以通过这个方法复制这个文件,就不需要自己再写很多属性
还可以通过安装 Nuget 的方法自动安装添加这个文件到最顶层文件夹,这时更新属性就通过更新 Nuget 的方式
寻找方式
只需要把 Directory.Build.props
放在文件夹,就会自动去找到这个文件,使用属性。但是如果我再创建一个文件夹DeahelSuceamor
在这个文件夹里创建一个项目,并且在这个文件夹放一个 Directory.Build.props
猜猜现在会使用哪个 Directory.Build.props
文件。
是不是会和 .gitignore
一样继承?骚年,想太多,自己写去吧。之后找到最靠近项目的第一个 Directory.Build.props
使用这个文件,只要找到第一个文件就不会继续从上面继续找。
从$(MSBuildProjectFullPath)
开始找,那么$(MSBuildProjectFullPath)
是哪个文件夹?骚年,是不是没有认真看博客,本渣已经说了这个知识在项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv,自己点去看
例如这个项目是在D:\lindexi\GeajoYabaFarcho\DeahelSuceamor\SalisHayjuGiszea
,寻找顺序是
D:\lindexi\GeajoYabaFarcho\DeahelSuceamor\SalisHayjuGiszea
D:\lindexi\GeajoYabaFarcho\DeahelSuceamor\
D:\lindexi\GeajoYabaFarcho\
D:\lindexi\
D:\
不使用这个功能
通过设置ImportDirectoryBuildTargets
为 false 可以不使用这个功能
合并多个文件
刚刚是不是告诉大家,在找到第一个 Directory.Build.props 就不会继续往上找,如果需要合并多个 Directory.Build.props 文件就需要写一些代码,这个代码有些长,例如在D:\lindexi\GeajoYabaFarcho\DeahelSuceamor
文件夹下有 Directory.Build.props 文件,需要在这个文件继续引用上一层的 Directory.Build.props 文件,就需要添加下面代码
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
这个代码写在哪?就在那个需要和上一层的 Directory.Build.props 合并的 Directory.Build.props 里
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
<PropertyGroup>
<Authors>lindexi</Authors>
<Version>1.5.0</Version>
</PropertyGroup>
</Project>
这样写就会找到第一个 Directory.Build.props 还继续在上一层找另外一个 Directory.Build.props 文件,把两个文件的属性合并。如果有严谨看上面代码,会发现多了一个属性Version
,还记得刚刚上一层的 Directory.Build.props 定义的属性?里面也包含了 Version ,如果两个 Directory.Build.props 都定义 Version 是使用哪个?
估计是来打一下,看哪个文件赢就使用哪个文件,不过在这里不需要打,因为这个值使用的是哪一个和写 Import 的地方有关,在上面的代码是处于最里层的 Directory.Build.props 赢,最后的版本就是 1.5 。但是如果使用下面的代码,就是上层的 Directory.Build.props 修改属性,最后版本是 1.2 ,因为最后出手的才是有用的。
<Project>
<PropertyGroup>
<Authors>lindexi</Authors>
<Version>1.5.0</Version>
</PropertyGroup>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
</Project>
因为 Import 就是导入另一个 Directory.Build.props ,如果之前已经有定义一个值,在导入时发现相同的值就替换。
参见:
https://docs.microsoft.com/en-us/visualstudio/msbuild/what-s-new-in-msbuild-15-0
2019-11-29-Roslyn-使用-Directory.Build.props-文件定义编译的更多相关文章
- Roslyn 使用 Directory.Build.props 管理多个项目配置
在一些大项目需要很多独立的仓库来做,每个仓库之间都会有很多相同的配置,本文告诉大家如何通过 Directory.Build.props 管理多个项目配置 在我的 MVVM 框架需要三个不同的库,一个是 ...
- 2019.11.29 Mysql的数据操作
为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...
- 2019.11.29 SAP SMTP郵件服務器配置 發送端 QQ郵箱
今天群裏的小夥伴問了如何配置郵件的問題,隨自己在sap裏面配置了一個 1. RZ10配置參數 a) 参数配置前,先导入激活版本 执行完毕后返回 b) 输入参数文件DEFAU ...
- pycharm+anaconda在Mac上的配置方法 2019.11.29
内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...
- Supervision meeting notes 2019/11/29
topic 分支: 1. subgraph/subsequence mining Wang Jin, routine behavior/ motif. Philippe Fournier Viger ...
- 2019-5-21-Roslyn-使用-Directory.Build.props-管理多个项目配置
title author date CreateTime categories Roslyn 使用 Directory.Build.props 管理多个项目配置 lindexi 2019-05-21 ...
- 2018-10-19-Roslyn-使用-Directory.Build.props-文件定义编译
title author date CreateTime categories Roslyn 使用 Directory.Build.props 文件定义编译 lindexi 2018-10-19 18 ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- 黑盒测试实践--Day5 11.29
黑盒测试实践--Day5 11.29 今天完成任务情况: 分析系统需求,完成场景用例设计 小组负责测试的同学学习安装自动测试工具--QTP,并在线学习操作 小黄 今天的任务是完成场景测试用例的设计.在 ...
随机推荐
- 使用Desktop App Converter打包桌面应用程序
打包具有安装程序 (.msi) 的应用程序 DesktopAppConverter.exe -Installer C:\Installer\MyAppSetup.msi -Destination C: ...
- Windows下安装TensorFlow教程
目录 安装Python3.6 配置环境变量 安装TensorFlow 验证安装 报错或选版本 安装Python3.6 建议直接安装anaconda 下载地址:https://www.anaconda. ...
- Python中的super()用法
Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this,比如:C#),用于传递对象本身,而在调用的时候则不 必显式传递,系统会自动传递. 今天我们介绍的主角是su ...
- [SPSS]学习笔记--数据分布形状描述
以下内容摘自:公众号- SPSS生活统计学 保存做复习之用. 峰度(Kurtosis) 峰度是描述总体(样本)中所有取值分布形态陡缓程度的统计量.通过计算可以得到峰度系数,峰度系数与分布形态的关系是: ...
- HttpRunnerManager(一)--安装
1.相关地址 (1)中文文档介绍:https://cn.httprunner.org/ (2)相关安装包下载地址:链接:https://pan.baidu.com/s/13SP1mFsNKrLK0sn ...
- Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.HashMap; import java.util.Iterator; import ...
- logstash 写入数据到elasticsearch 索引相差8小时解决办法
问题说明 Logstash用的UTC时间, logstash在按每天输出到elasticsearch时,因为时区使用utc,造成每天8:00才创建当天索引,而8:00以前数据则输出到昨天的索引 # 使 ...
- python--006
一.函数的作用域 1.作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 例一: name='alex' def foo(): name='lhf' def bar(): print(na ...
- <<C++ Primer>> 第二章 变量和基本类型 术语表
术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节 别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...
- Johnson算法学习笔记
\(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...