2018-10-19-Roslyn-使用-Directory.Build.props-文件定义编译
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
Roslyn 使用 Directory.Build.props 文件定义编译
|
lindexi
|
2018-10-19 18:35:27 +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
2018-10-19-Roslyn-使用-Directory.Build.props-文件定义编译的更多相关文章
- Roslyn 使用 Directory.Build.props 管理多个项目配置
在一些大项目需要很多独立的仓库来做,每个仓库之间都会有很多相同的配置,本文告诉大家如何通过 Directory.Build.props 管理多个项目配置 在我的 MVVM 框架需要三个不同的库,一个是 ...
- IDC Digital Transition Annual Festival(2018.10.19)
时间:2018.10.19地点:北京万达文化酒店
- 2018.10.19浪在ACM 集训队第一次测试赛
2018.10.19浪在ACM 集训队第一次测试赛 待参考资料: [1]:https://blog.csdn.net/XLno_name/article/details/78559973?utm_so ...
- 20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)
20172319 2018.10.19 <Java程序设计教程>第7周课堂实践 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...
- 2018.10.19 bzoj1057: [ZJOI2007]棋盘制作(悬线法)
传送门 悬线法板题. 如果只求最大矩形面积那么跟玉蟾宫是一道题. 现在要求最大正方形面积. 所以每次更新最大矩形面积时用矩形宽的平方更新一下正方形答案就行了. 代码: #include<bits ...
- 2018.10.19 NOIP训练 变化的序列(线性dp)
传送门 f[i][j]f[i][j]f[i][j]表示后iii个对答案贡献有jjj个a的方案数. 可以发现最后a,ba,ba,b的总个数一定是n∗(n−1)/2n*(n-1)/2n∗(n−1)/2 因 ...
- 2018.10.19 NOIP训练 桌子(快速幂优化dp)
传送门 勉强算一道dp好题. 显然第kkk列和第k+nk+nk+n列放的棋子数是相同的. 因此只需要统计出前nnn列的选法数. 对于前mmm%nnn列,一共有(m−1)/n+1(m-1)/n+1(m− ...
- 2018.10.19 bzoj1584: Cleaning Up 打扫卫生(线性dp)
传送门 dp妙题. 考虑到每个位置分一组才花费nnn的贡献. 因此某一段不同的数的个数不能超过sqrt(n)sqrt(n)sqrt(n),于是对于当前的位置iii我们记pos[j]pos[j]pos[ ...
- 2018.10.19 NOIP模拟 比特战争(kruskal)
传送门 考完发现是sbsbsb题啊. 直接考虑优化状压的转移. 可以证明最优解一定在求最小生成树的时候取得. 因此再最小生成树时维护一下连通块的最值统计答案就行了. 代码
- 2018.10.19 NOIP模拟 硬币(矩阵快速幂优化dp)
传送门 不得不说神仙出题人DZYODZYODZYO出的题是真的妙. f[i][j][k]f[i][j][k]f[i][j][k]表示选的硬币最大面值为iii最小面值不小于jjj,总面值为kkk时的选法 ...
随机推荐
- 你真的会用Action的模型绑定吗?
在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...
- jquery学习:选择器&dom操作
分类; 1.基本选择器 1.标签选择器(元素选择器) * 语法:$("html标签名”) 获得所有匹配标签名称的元素 2.id选择器 * 语法:$("#id的属性值" ...
- ubuntu 16.04 换源
第一步:备份原来的源文件 cd /etc/apt/ 命令 cp sources.list sources.list.bak 将sources.list备份到sources.list.bak 第二步:替 ...
- h5文件简介
h5文件是层次格式的第5代版本,用于存储科学数据的一种文件格式和库文件,由美国超级计算中心与应用中心研发的文件格式,用以存储和组织大规模数据. H5将文件结构简化成两个主要的对象类型: 1 数据集da ...
- LTIME16小结(CodeChef)
题目链接 最后一题是Splay...还没有学会..蒟蒻!!! A /****************************************************************** ...
- light oj 1149 Factors and Multiples(二分匹配)
LightOJ1149 :Factors and Multiples 时间限制:2000MS 内存限制:32768KByte 64位IO格式:%lld & %llu 描述 You w ...
- JS---案例:表格隔行变色(鼠标划过背景色恢复)
案例:表格隔行变色(鼠标划过背景色恢复) <!DOCTYPE html> <html> <head lang="en"> <meta ch ...
- nyoj zb的生日【背包型DFS/选or不选】
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- MySQL--修改Mac中的默认编码
1.在终端中进入到etc目录下 2.打开etc目录下的my.cnf文件(如果这样修改不了的就要提高用户权限, 可以尝试使用sudo来打开文件) 3.将一下内容添加到my.cnf文件中 [client] ...
- C#基础之特性
官网地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/attributes/accessing- ...