更新:html
一、若是想使用个人 Blog.Core 项目,而且又想快速重命名成本身的项目,请看这个Wiki:https://github.com/anjoy8/Blog.Core/wiki/Temple-Nugetgit
开工是利啦!哈喽各位小伙伴,周三好呀,新的一年又开始了,老张给你们作个榜样,新的一年也要好好学习哟,这两天闲的无事就整理整理了这个系列的 Github 代码,增长了一个英文的 README ,而后把 netcore2.0 合并到了项目里,并新建了一个2.0的分支,相信有些小伙伴应该也发现了,原本想试试 core 3.0版本,发现必需要安装 Visual Studio 2019 版本,可怜电脑已经安装了 vs15 和 vs17,因此就放弃了安装vs19,等明年,哦不对,是今年😂微软正式发布3.0的时候,再整理一个分支吧(之后确定会有新的内容一直更新的)。github
(目前是2.2版本,因做者开源的项目较多,维护成本太高,因此本项目其余分支再也不提供支持)web
在整理代码的时候,我想到,上周在《38 ║自动初始化数据库(不按期更新)》中,我把项目的自动建立数据库并添加种子数据的功能给加上了,给你们提供了一个思路,之后你们建立项目能够这么玩儿,我的感受仍是很方便的,因而我就想到了一个问题,应该是只要开发必定时间的小伙伴,都会遇到的问题:shell
情景:本身通过多年开发的沉淀后,开发出一个属于本身的一套Demo项目,亦或是借鉴别人的项目后,优化了一个。好比个人第一个项目,采用 IService+ IRepository 分层的;或者好比个人第二个项目,采用DDD领域驱动+CQRS模式的。而后咱们在别的地方使用的时候(多是下一个公司),若是还想用本身的模板,也多是供新入职的同事使用,常常会是如下几个办法,你们看看你属于哪种:数据库
0、对比着以前的项目结构,在VistulStudio中手动建立一个空的解决方案,从零开始,一点一点搭建。// 麻烦之大,可想而知json
一、经过dotnet cli 命令来建立空项目,而后手动。// 会简化一丢丢,但仍须要一层一层的建立类库;api
二、把Demo工程代码里拷贝到U盘,或者上传到云盘,而后下载下来,改吧改吧。// 寻找过程很麻烦,依赖代码承载工具;架构
三、把Demo工程代码 Pull 到 Github 上,在别的地方直接 Clone ,而后改吧改吧。 // 开源出源码,私密性不强;并发
你们能够看到,上边的这几个办法,都会有这样或那样的问题,快的不方便,方便的太局限。这个时候你会说,这怎么可能每天建立工程,有时候一个项目搭建好了能用一年,固然,这种也是有的,可是总会有新项目的,并且上边的这些都有一个通病,不知道你们是否发现:就是不能快速修改工程名称!举个栗子,个人这个 Github 上的项目,你们下载下来,怎么快速把 Blog.Core 改为 HelloBlog 呢?
这个时候我想到了一个东西,你们平时的时候应该用到过,就是使用 dotnet CLI 建立一个 net core api 项目是怎么作的呢:
// 经过命令行建立 core api项目 dotnet new webapi
这么建立好了之后,咱们就能够本身一点一点的搭建项目了,这个时候我就想,那既然有 webapi 这个模板,咱们自定义一个属于本身的一个或多个模板不就好了?!到时候只须要这么简单的输入一行命令,就能生成一套项目,各层明确,引用清晰,能在任何有网的电脑上运行,而且直接就能跑,想一想都会感受很刺激,不是么?!好比这样:
// 经过自定义命令行建立本身的项目 dotnet new 我是模板名称 -n HelloBlog
好啦,开始今天的讲解 —— 自定义dotnet 模板,很简单,只要你按照个人一步一步往下走,必定会看得懂。若是你看完本文,对你有帮助,请点个赞👍或评论📑哟。
最终的效果是这样的:
既然我们要建立一个自定义的 dotnet 项目模板,那就必须本身先有本身的一套Code,有了这套 code,咱们才能导入到 dotnet cli 模板库中使用。
今天呢,我就使用我们的这个Blog.Core 项目了(https://github.com/anjoy8/Blog.Core),若是你想用本身的模板,前提是:
一、必须Code已经成型了,意思就是说,分层清楚,引用明确,只不过没有复杂的内容。
二、必须编译成功,不能有任何错误,不然后边会各类麻烦。
三、尽可能能跑起来,就是能显示出界面,固然也不是必要条件,好比若是你新建了控制台程序,是没有web页面的。
四、通常不要把生成的dll文件包含其中,若是你下载个人Github代码,会发现只有400k,由于我把可执行文件都过滤了。
今天呢,我就手把手把我们的这套代码给原封不动的分发导入到 dotnet 模板库中,好比这样(这是我本机测试的,正式模板会在下文详细说明):
除了我们的这个项目,之后我还会创建一个基于DDD领域驱动设计的 dotnet 模板,这里先留个坑,到时候把命令行放到这里:(dotnet new -i xxxxxxx)
固然你也能够建立一个,若是你的项目比较好,看完这篇文章后,能够在下边留言哟,让你们都使用使用。
由于使用我们这个项目,因此这一步很简单,注意不要把项目编译后的dll文件包含里边,一方面打包的时候占资源,另外一方面可能会出错,
那项目源代码准备好了,接下来怎么作呢,别着急,请往下看。
如今咱们就须要把上边准备的项目导入 dotnet 模板了:
在你的电脑任何地方,新建一个模板文件夹temple,用于之后打包多个模板使用,好比我是这样的(尽可能按照这个格式来:content文件夹包含code模板):
├── temple // 用来存放全部的模板 │ ├── BlogCoreTemple // BlogCore模板所有内容 │ │ ├── content // 存放Code 项目代码,可直接运行 │ │ │ ├── Blog.Core │ │ │ ├── . │ │ │ ├── . │ │ │ ├── . │ │ │ ├── Blog.Core.Services │ │ │ └── Blog.Core.sln │ │ │ │ │ ├── license // 存放版本许可信息,若是不添加,后边会警告,文章后边会提到 │ │ │ └── license.txt │ │ │ │ │ └── 其余待定 // 这里文章后边会打包的时候用到 │ │ │ └── DDDTemple // DDD模板信息
既然咱们要自定义模板,那咱们就必须配置,好比做者信息,好比模板名称,要否则dotnet咋知道哪个模板是你自定义的呢。接下来我们定义配置文件:
{ "$schema": "http://json.schemastore.org/template",//template.json 文件的 JSON 架构,能够不要该键值对 "author": "lao zhang", //必填!模板建立者 "classifications": [ "Web/WebAPI" ], //必填,这个对应模板的Tags,其余的好比 [ "Common", "Console" ], "name": "Blog.Core Dotnet", //必填,这个是模板名,好比ASP.NET Core Web API "identity": "Blog.Core.Template", //可选,模板的惟一名称 "shortName": "blogcoretpl", //必填,这个对应模板的短名称,好比webapi "tags": { "language": "C#" , "type":"project" }, "sourceName": "Blog.Core", // 可选,要替换的名字,这个就是模板的项目名,之后新建的时候,会把这个名字替换成其余,好比HelloBlog(警告!这里不要写一些专用词汇,好比app呀,net呀,core之类的) "preferNameDirectory": true // 可选,添加目录 }
提示:这个模板被执行分发,添加到 dotnet 模板后,尽可能保存好,不要删掉,由于若是删掉后,若是之后想卸载这个本地的模板,就不能了。
若要从本地文件系统卸载模板,须要彻底限定路径。 例如,C:\Users\<USER>\Documents\Templates\GarciaSoftware.ConsoleTemplate.CSharp 有效。
详细信息能够查看官网:https://docs.microsoft.com/zh-cn/dotnet/core/tools/custom-templates
├── temple // 用来存放全部的模板 │ ├── BlogCoreTemple // BlogCore模板所有内容 │ │ ├── content // 存放Code 项目代码,可直接运行 │ │ │ ├── .template.config // 模板配置文件夹 │ │ │ │ └── template.json // 配置文件 │ │ │ ├── Blog.Core │ │ │ ├── . │ │ │ ├── . │ │ │ ├── . │ │ │ ├── Blog.Core.Services │ │ │ └── Blog.Core.sln │ │ │ │ │ ├── license // 存放版本许可信息,若是不添加,后边会警告,文章后边会提到 │ │ │ └── license.txt │ │ │ │ │ └── 其余待定 // 这里文章后边会打包的时候用到 │ │ │ └── DDDTemple // DDD模板信息
通过上面两步的处理,我们已经把模板源代码准备好了,而且也按照固定的规则,把配置文件配置好了,接下来就是来分发了,白话就是说:把代码导入到 dotnet 模板里。
这个是很简单的,代码DOS命令窗口,输入命令(注意文件夹的路径):
// 使用文件分发模板, // 注意文件路径:content文件夹的上一级,能够对比上边的截图中的文件夹结构 dotnet new -i D:\myTpl\temple\BlogCoreTemple
这个时候你会发现,系统中已经有了咱们的模板!(我为了区别下文的第二种方法,故意在模板后加了个22)
与此对应的,就是卸载了,注意刚刚的那个文件地址不要删了(就是把新建的字母 i 变成了 u):
dotnet new -u D:\myTpl\temple\BlogCoreTemple
随便找一个其余文件夹,而后执行咱们的操做:
成功了有没有!是否是很方便!之后咱们把咱们的项目模板导入到本地的 dotnet 中,就能够很快的搭建一个如出一辙的项目(这个时候若是你运行 dotnet run会报错,由于咱们解耦了,会找不到service.dll文件,咱们手动F6编译便可),并且项目名称也能够自定义是否是很给力!至少我是感受挺方便的。
可是,我开心了一分钟后,发现了这个方法的一个弊端,聪明的你应该也发现了,由于咱们使用的是文件发布,因此咱们只能在本机使用(不信的话,你能够在你电脑上执行下这个命令 dotnet new blogcoretpl22,确定报错),那若是在家里,或者在新的公司,亦或让新来的同事使用这个模板,该如何使用呢,总不能又要重蹈覆辙,开始拷贝代码吧,哦NO!确定不想这样,做为强迫症的我,确定感受不是很爽,那怎么办呢,别慌,下边的方法能够完美的解决这个问题!
在 content 文件夹旁边,添加 nuspec 文件。 nuspec 文件是 XML 清单文件,用于描述包内容,并促进建立 NuGet 包。
重要:感谢小伙伴@ jamee1696 提醒!下边范本文件中的汉字只是个人解释说明,若是你本身作,请千万要去掉,不能带中文字符!
<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> <metadata> <id>Blog.Core.Webapi.Template</id>// nuget包标识,在 nuget.org 或包驻留的任意库中必须是惟一的 <version>1.0.0</version>// 遵循 major.minor.patch 模式的包版本。 <description> Creates a blog core webapi app.// 用于 UI 显示的包的详细说明。 </description> <authors>Lao zhang</authors>// 包建立者的逗号分隔列表,与 nuget.org 上的配置文件名称一致 <packageTypes> <packageType name="Template" />// 包类型 </packageTypes> <license type="file">license\license.txt</license>// 上文提到的许可证信息 </metadata> </package>
上边配置好了,那怎么如何打包呢,如今我们就须要 nuget.exe 工具了:https://www.nuget.org/downloads ,下载最新的exe文件便可,注意这个不是安装文件,这个须要配合着项目使用,若是你双击是无效的,把下载好的 nuget.exe 拷贝到 nuspec 范本文件同级的目录中:
文件也配置好了,nuget执行文件也下载好了,接下来我们就是正式开始打包了:
打开 DOS 命令窗口,进入到当前文件夹,而后直接运行打包命令:(注意打包的文件,是我们建立的 nuspec 范本文件)
// 执行打包操做,文件地址就是 nuspec 范本地址 nuget pack D:\myTpl\temple\BlogCoreTemple\Blog.Core.Webapi.Template.nuspec
发现咱们以及打包成功:
注意:这里有小伙伴提示错误nuget 命令行无效 ,你须要在nuget.exe 目录里操做,而且是 CMD 命令窗口,不是 powershell
固然你也能够这样:
将文件夹添加到 nuget.exe
中放置 PATH 环境变量的位置,这样就能够从任意位置使用 CLI 工具。
提醒下,你们要注意模板的质量,尽可能不要过多的上传打包哟。
接下来就是最后一步了,将咱们打包成功的 nupkg 包,发布到 nuget.org ,这里有多种方法,我只演示web门户操做:
首先你须要在 nuget.org 官网注册帐号,这里不细说,而后点击到上传页面:https://www.nuget.org/packages/manage/upload
选择 nuget.org 顶部菜单中的“上传”,并浏览到包位置。
nuget.org 告知包名称是否可用。 若是没法使用,则更改项目中的包标识符、从新生成,并重试上传。
若是包名称可用,nuget.org 将打开“验证”部分,能够在其中查看包清单中的元数据。 若要更改任何元数据,请编辑项目(项目文件或 .nuspec
文件)、从新生成、从新建立包,而后再次上传。
在“导入文档”下,能够粘贴 Markdown、将 URL 指向文档,或上传文档文件。
当全部信息准备就绪后,选择“提交”按钮
上传成功后,nuget 会后台进行扫描病毒,而后进行发布,中间大概等待10分钟后,你会收到一个官方的邮件,提示你已经发布成功:
地址:https://www.nuget.org/packages/Blog.Core.Webapi.Template/
具体的参考官网:https://docs.microsoft.com/zh-cn/nuget/create-packages/publish-a-package#package-validation-and-indexing
在上边发布成功了之后,咱们直接就能够经过 nuget 惟一包id,来进行导入dotnet 模板操做:
// 经过nuget.org ID 导入分发,这个名称,就是咱们以前在 nuspec 范本文件中,配置的nuget包 ID dotnet new -i Blog.Core.Webapi.Template
而后就能够看到已经导入成功了,至于使用,就和以前的经过文件系统导入的是同样的:
是否是很不错!彻底解放双手,也不依赖工具,就能够直接建立一套相同的项目,并能够自定义项目名:
不信的话,你能够在你电脑里执行下刚刚的那个模板导入命令(dotnet new -i Blog.Core.Webapi.Template),能够成功的导入到你的电脑里(注意必定要是管理员权限打开命令行窗口,若是报错,多是401权限问题,请在下方留言)。若是你用不了这个命令,证实你的电脑是没有最高权限的,那就请用下边的这个方法吧。
若是你不能直接用 nuget.org 的标识ID来分发模板,那就直接用 nupkg 包导入吧,下载本文中的包:https://www.nuget.org/api/v2/package/Blog.Core.Webapi.Template/1.0.0,或者用上边本地的打包好的,是同样的
而后执行命令:
// 将nupkg 包分发 dotnet new -i E:\my-file\temple\Blog.Core.Webapi.Template.1.0.0.nupkg
固然若是你不想要,也能够,很简单,直接执行这个命令就行
// 从 nuget.org 中存储的 NuGet 包卸载模板 dotnet new -u Blog.Core.Webapi.Template
今天我们主要讲解了如何把本身的源代码Demo项目,分发到 dotnet 模板中;而后又讲解了如何把本身的源代码项目进行 nuget 打包,并发布到 nuget.org 库中;
最后将发布到 nuget 包分发到 dotne 模板中,方便的在任何地方使用。
已经在GitHub 上添加了,你们能够下载看看:
而后在Nuget包管理器中,能够找到,只不过这是一个整个工程,你们不用添加到项目里,之后你若是建立一个Tool,能够添加到这里,还记得我们的ORM么(https://github.com/anjoy8/AZLinli.ORM),我打算把这个提交上去,本身使用。
( 上边打包的项目,在 Nuget 包中能够搜到)
最终的文件结构是这样的:
├── temple // 用来存放全部的模板 │ ├── BlogCoreTemple // BlogCore模板所有内容 │ │ ├── content // 存放Code 项目代码,可直接运行 │ │ │ ├── .template.config // 模板配置文件夹 │ │ │ │ └── template.json // 配置文件 │ │ │ ├── Blog.Core │ │ │ ├── . │ │ │ ├── . │ │ │ ├── . │ │ │ ├── Blog.Core.Services │ │ │ └── Blog.Core.sln │ │ │ │ │ ├── license // 存放版本许可信息,若是不添加,后边会警告,文章后边会提到 │ │ │ └── license.txt │ │ │ │ │ ├── Blog.Core.Webapi.Template.nuspec // nuget 打包的范本配置文件 │ │ └── nuget.exe // nuget.exe 可执行文件 │ │ │ └── DDDTemple // DDD模板信息