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文件添加字符串: 注意!记得要在字符文件中加上这些: ...
随机推荐
- 第十七篇:csv拆分、csv转excel方法
首先对微软的office功能表示敬佩!可能是这些办公软件太过平常化,所以体会不到他有多牛!csv格式数据以前没接触过,百度百科定义,Comma-Separated Values,CSV,逗号分隔值,或 ...
- java获取服务器路径
java获取服务器一些信息的方法(服务器地址/相对路径/端口/项目名字 request.getServletContext().getRealPath("/") 获取项目所在服务 ...
- Window中在Intellij idea开发时常用快捷键
以下idea中的快捷键是在window 7中确认过,如果快捷键不起作用,可能是该快捷键被其它软件占用,或系统不同导致. 1.Ctrl + Z:撤回代码: 2.Ctrl + Shift + Z:恢复撤回 ...
- vue组件间通信用例
父组件传值给子组件 -- 以封装公用slide组件为例 父组件 <template> <section class="banner"> <slide ...
- java笔试之简单密码
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了.哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全. 假设渊子原来一个BBS上的密码为zvbo9441987,为了方便 ...
- [转]Java多线程
一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌 ...
- 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...
- Spring boot配置Dubbo三种方式
方式一 使用注解的方式 导入dubbo-starter 在application.properties配置属性 使用@Service暴露服务 使用@Reference引用服务 使用@EnableDub ...
- php数据结构课程---6、常见排序有哪些
php数据结构课程---6.常见排序有哪些 一.总结 一句话总结: 冒泡排序(Bubble sort):依次交换 选择排序 ( Selection Sort ):在未排序序列中找到最小(大)元素,依次 ...
- hession RMI 远程调用
/** * * @author administror * 在java中,需要去extends 继承java.rmi.Remote 接口,才能称为在于服务器流的远程对象. * 各客服端调用 * */p ...