2019-7-29-Roslyn-使用-Target-替换占位符方式生成-nuget-打包
title | author | date | CreateTime | categories |
---|---|---|---|---|
Roslyn 使用 Target 替换占位符方式生成 nuget 打包
|
lindexi
|
2019-7-29 10:1:18 +0800
|
2018-07-24 20:34:29 +0800
|
Roslyn MSBuild 编译器 nuget 打包
|
本文告诉大家如何编写在编译过程修改打包文件
在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包
现在尝试创建一个项目 NearjerbetearDeeyitoo ,在这个项目用来告诉大家如何使用替换占位符的方法
在开始做之前需要告诉大家为什么需要使用这个方法
因为写的 nuspec 文件是可以保持不动,在多个项目使用相同的一个 nuspec 文件,但是对不同的项目使用定制的方式,让项目自己输入在编译才能知道的变量,这样可以保持不修改 nusec 文件。
先来创建一个 nuspec 文件,把这个文件随意一个文件名ReresouJesou.nuspec
,如果在 VisualStudio 使用某个 nuspec 文件打包,就需要在项目文件添加下面代码
- <NuspecFile>ReresouJesou.nuspec</NuspecFile>
为了在之后的打包过程可以添加一些变量,就需要修改项目文件
- <PropertyGroup>
- <TargetFramework>netstandard2.0</TargetFramework>
- <PackageId>NearjerbetearDeeyitoo</PackageId>
- <NuspecFile>ReresouJesou.nuspec</NuspecFile>
- <IsTool>True</IsTool>
- </PropertyGroup>
需要稍微解释一下上面的代码,这里的 PackageId
实际上是我随意给的,大家可以替换PackageId
为自己喜欢的字符串。在NuspecFile
就需要指定nuspec
文件所在的路径,这里用的是相对的路径。最后设置IsTool
只是用来告诉安装 Nuget 的程序,这是一个工具 nuget 包没有引用。
现在修改一下 ReresouJesou.nuspec
文件,添加下面代码
- <?xml version="1.0" encoding="utf-8"?>
- <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
- <metadata>
- <id>$id$</id>
- <version>$version$</version>
- <authors>lindexi</authors>
- <owners>lindexi</owners>
- <developmentDependency>true</developmentDependency>
- <projectUrl>https://lindexi.github.io/lindexi</projectUrl>
- <description>这个文件告诉大家如何在编译修改占位字符</description>
- </metadata>
- </package>
可以从上面代码看到和普通的 nuget 文件的不相同,第一个是id
使用的是$id$
,这里的id就是使用占位符,可以在项目文件使用 target 的方式替换占位符。
上面代码有 id 和版本都使用占位符,下面就来写 target 来替换两个占位符为项目需要的字符。
- <Target Name="GenerateNuspecProperties" BeforeTargets="GenerateNuspec">
- <PropertyGroup>
- <NuspecProperties>
- $(NuspecProperties);
- id=$(PackageId);
- version=1.0;
- dll=$(TargetPath);
- </NuspecProperties>
- </PropertyGroup>
- </Target>
写一个 Target 需要给这个 Target 一个命名,还需要告诉 VisualStudio 在什么的时候才使用这个 Target 这里是在创建 nuget 文件的时候才使用。
这里通过定义 nuget 属性的方式用来替换。
替换的语法是 占位符 = 字符串;
的方法,因为这里的字符串可以使用 $(变量)
的方式,所以就可以用到刚才在上面定义的字符串。
在属性的$(NuspecProperties);
就是在有其他的 target 也使用了 NuspecProperties
不会被这个 target 覆盖。从上面的代码可以看到我多设置了一个dll
的字符串,在nuget文件是不存在这个dll
字符串,但是也没有问题。
但是可以多设置 nuget 文件不使用的字符串,不可以少设置 nuget 文件存在的字符串,不然就可能出现下面的代码
- 错误 值不能为 null 或空字符串。
- NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets
如何写 target 请看 如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task) - walterlv
更多关于 Roslyn 请看 手把手教你写 Roslyn 修改编译
2019-7-29-Roslyn-使用-Target-替换占位符方式生成-nuget-打包的更多相关文章
- Roslyn 使用 Target 替换占位符方式生成 nuget 打包
本文告诉大家如何编写在编译过程修改打包文件 在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包 现在尝试创建一个项目 NearjerbetearDeeyito ...
- maven 编译替换占位符
首先开启资源配置的插件,由此插件替换占位符 <plugin> <groupId>org.apache.maven.plugins</groupId> <art ...
- String替换占位符
/** * 依次替换占位符 * 例如: 姓名:{s},电话:{s},邮箱:{s} --> 姓名:小张,电话:18800000001,邮箱:abc@123.com * pattern = &quo ...
- spring中PropertyPlaceholderHelper替换占位符的值
1.Properties中的值替换¥{}或者#{}占位符 String text = "foo=${foo},bar=${bar}"; Properties props = new ...
- spring源码解析(一)---占位符解析替换
一.结构类图 ①.PropertyResolver : Environment的顶层接口,主要提供属性检索和解析带占位符的文本.bean.xml配置中的所有占位符例如${}都由它解析 ②.Config ...
- 【Spring源码分析】.properties文件读取及占位符${...}替换源码解析
前言 我们在开发中常遇到一种场景,Bean里面有一些参数是比较固定的,这种时候通常会采用配置的方式,将这些参数配置在.properties文件中,然后在Bean实例化的时候通过Spring将这些.pr ...
- Spring Boot使用Maven打包替换资源文件占位符
在Spring Boot开发中,通过Maven构建项目依赖是一件比较舒心的事,可以为我们省去处理冲突等大部分问题,将更多的精力用于业务功能上.近期在项目中,由于项目集成了其他外部系统资源文件,需要根据 ...
- 【占位符替换】替换String中的占位符标志位{placeholder}
概述 占位符替换, 占位符表示为:{placeholder}; 示例:替换如下{xxx}占位符中的内容 "名字:{name},年龄:{age},学校:{school}" 提供了两种 ...
- Java替换字符串中的占位符
在开发中,会有动态配置字符串其中的某些字符,如何使用字符中的占位符,并且在代码动态替换占位符实现动态配置字符串! 1.定义字符串时,再string文件添加字符串: 注意!记得要在字符文件中加上这些: ...
随机推荐
- 第十二篇:随手记一下javaBean的setter,getter方法的命名问题
今天测试新写的一个系统表的完整Ibatis配置和调用,因为经验少,到处撞墙...其他的坑爹问题就不提了 测试sqlMapClient.queryForList("...",para ...
- raw_input和sys.stdin.readline()
sys.stdin.readline( )会将标准输入全部获取,包括末尾的'\n',因此用len计算长度时是把换行符'\n'算进去了的; raw_input( )获取输入时返回的结果是不包含末尾的换行 ...
- LINUX挂接Windows文件共享
Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba 软件包.现在流行的linux发行版绝大多数已经包含了samba软 ...
- ps axu 参数说明
问题:1.ps axu 看到进程的time不清楚什么意思 ru: resin 31507 0.2 1.3 3569452 98340 ? Sl Jul28 7:11 / ...
- zookeeper结构和命令
1.1. zookeeper特性 1.Zookeeper:一个leader,多个follower组成的集群 2.全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个serv ...
- Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】
Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...
- 2016.8.19上午初中部NOIP普及组比赛总结
2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...
- 廖雪峰Java11多线程编程-3高级concurrent包-7Future
JDK提供了ExecutorService接口表示线程池,可以通过submit提交一个任务. ExecutorService executor = Executors.newFixedThreadPo ...
- springMVC or response redirect https
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> < ...
- ROC曲线及AUC
ROC曲线 意义 ROC曲线指受试者工作特征曲线 / 接收器操作特性曲线(receiver operating characteristic curve),是反映敏感性和特异性连续变量的综合指标,是用 ...