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文件添加字符串: 注意!记得要在字符文件中加上这些: ...
随机推荐
- C++开发系列-C语言的malloc与C++的new分配空间
概述 在软件开发过程中,常常需要动态地分配和撤销存储空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符ne ...
- Gabor filter for image processing and computer vision
介绍 我们已经知道,傅里叶变换是一种信号处理中的有力工具,可以帮助我们将图像从空域转换到频域,并提取到空域上不易提取的特征.但是经过傅里叶变换后,图像在不同位置的频度特征往往混合在一起,但是Gabor ...
- Android开发 EditText的开发记录
设置显示内容与隐藏内容 if (isChecked){ editPassword.setTransformationMethod(HideReturnsTransformationMethod.get ...
- selenium借助AutoIt识别上传(下载)详解【转】
AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动 ...
- leetcode 132 Palindrome Pairs 2
lc132 Palindrome Pairs 2 大致与lc131相同,这里要求的是最小分割方案 同样可以分割成子问题 dp[i][j]还是表示s(i~j)是否为palindrome res[i]则用 ...
- 廖雪峰Java11多线程编程-3高级concurrent包-4Concurrent集合
Concurrent 用ReentrantLock+Condition实现Blocking Queue. Blocking Queue:当一个线程调用getTask()时,该方法内部可能让给线程进入等 ...
- JSM 基础
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信 ...
- VS2010-MFC(对话框:设置对话框控件的Tab顺序)
转自:http://www.jizhuomi.com/software/158.html 上一讲为“计算”按钮添加了消息处理函数后,加法计算器已经能够进行浮点数的加法运算.但是还有个遗留的小问题,就是 ...
- iOS开发CATransform3D.h属性详解和方法使用
1.CATransform3D简介 layer有个属性transform,是CATransform3D类型.可以使其在三维界面作平移.缩放和旋转单独或组合动画! CATransform3D结构体: / ...
- CSS中关于多个class样式设置的不同写法
html中: <div class="containerA"> 这是AAAAAAAAAAAAAAAAAAAAAAA样式 <div class="cont ...