从壹开始先后端分离 39 || 想建立本身的dotnet模板么?看这里

更新: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 模板,很简单,只要你按照个人一步一步往下走,必定会看得懂。若是你看完本文,对你有帮助,请点个赞👍或评论📑哟。

 最终的效果是这样的:

 

1、准备本身的Demo项目模板

一、开发一个空的并编译经过的项目

 既然我们要建立一个自定义的 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文件包含里边,一方面打包的时候占资源,另外一方面可能会出错,

那项目源代码准备好了,接下来怎么作呢,别着急,请往下看。

 

2、将 Demo 模板导入到dotnet模块库中

 如今咱们就须要把上边准备的项目导入 dotnet 模板了:

一、建立固定格式的源文件和文件夹

 在你的电脑任何地方,新建一个模板文件夹temple,用于之后打包多个模板使用,好比我是这样的(尽可能按照这个格式来:content文件夹包含code模板):

├── temple                               //  用来存放全部的模板
│   ├── BlogCoreTemple                   //  BlogCore模板所有内容
│   │    ├── content                     //  存放Code 项目代码,可直接运行
│   │    │    ├── Blog.Core          
│   │    │    ├──  .          
│   │    │    ├──  .          
│   │    │    ├──  .          
│   │    │    ├── Blog.Core.Services      
│   │    │    └── Blog.Core.sln     
│   │    │ 
│   │    ├── license                     //  存放版本许可信息,若是不添加,后边会警告,文章后边会提到
│   │    │    └── license.txt          
│   │    │ 
│   │    └── 其余待定                     // 这里文章后边会打包的时候用到
│   │
│   └── DDDTemple                        //  DDD模板信息

 

二、用于定义模板的配置文件 (template.json)

既然咱们要自定义模板,那咱们就必须配置,好比做者信息,好比模板名称,要否则dotnet咋知道哪个模板是你自定义的呢。接下来我们定义配置文件:

  1. 向源代码项目的根目录添加 .template.config 文件夹(注意是文件夹),到时候与它同级的文件都会被打包。
  2. 在 .template.config 文件夹中,建立 template.json 文件来配置模板。
{
    "$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 中,就能够很快的搭建一个如出一辙的项目(这个时候若是你运行 dotnet run会报错,由于咱们解耦了,会找不到service.dll文件,咱们手动F6编译便可),并且项目名称也能够自定义是否是很给力!至少我是感受挺方便的。

可是,我开心了一分钟后,发现了这个方法的一个弊端,聪明的你应该也发现了,由于咱们使用的是文件发布,因此咱们只能在本机使用(不信的话,你能够在你电脑上执行下这个命令 dotnet new blogcoretpl22,确定报错),那若是在家里,或者在新的公司,亦或让新来的同事使用这个模板,该如何使用呢,总不能又要重蹈覆辙,开始拷贝代码吧,哦NO!确定不想这样,做为强迫症的我,确定感受不是很爽,那怎么办呢,别慌,下边的方法能够完美的解决这个问题!

 

3、发布 Demo 项目到 Nuget

一、添加 nuspec 范本文件

在 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

 上边配置好了,那怎么如何打包呢,如今我们就须要 nuget.exe 工具了:https://www.nuget.org/downloads ,下载最新的exe文件便可,注意这个不是安装文件,这个须要配合着项目使用,若是你双击是无效的,把下载好的 nuget.exe 拷贝到 nuspec  范本文件同级的目录中:

 

三、生成Nupkg包

文件也配置好了,nuget执行文件也下载好了,接下来我们就是正式开始打包了:

打开 DOS 命令窗口,进入到当前文件夹,而后直接运行打包命令:(注意打包的文件,是我们建立的 nuspec 范本文件)

 

// 执行打包操做,文件地址就是 nuspec 范本地址
nuget pack D:\myTpl\temple\BlogCoreTemple\Blog.Core.Webapi.Template.nuspec

 

发现咱们以及打包成功:

 

 

 

注意:这里有小伙伴提示错误nuget 命令行无效 ,你须要在nuget.exe 目录里操做,而且是 CMD 命令窗口,不是 powershell

 

 

固然你也能够这样:

将文件夹添加到 nuget.exe 中放置 PATH 环境变量的位置,这样就能够从任意位置使用 CLI 工具。

 

四、发布到nuget.org(注意质量)

提醒下,你们要注意模板的质量,尽可能不要过多的上传打包哟。

 接下来就是最后一步了,将咱们打包成功的 nupkg 包,发布到 nuget.org ,这里有多种方法,我只演示web门户操做:

首先你须要在 nuget.org 官网注册帐号,这里不细说,而后点击到上传页面:https://www.nuget.org/packages/manage/upload

  1. 选择 nuget.org 顶部菜单中的“上传”,并浏览到包位置。

    在 nuget.org 上上传包

  2. nuget.org 告知包名称是否可用。 若是没法使用,则更改项目中的包标识符、从新生成,并重试上传。

  3. 若是包名称可用,nuget.org 将打开“验证”部分,能够在其中查看包清单中的元数据。 若要更改任何元数据,请编辑项目(项目文件或 .nuspec 文件)、从新生成、从新建立包,而后再次上传。

  4. 在“导入文档”下,能够粘贴 Markdown、将 URL 指向文档,或上传文档文件。

  5. 当全部信息准备就绪后,选择“提交”按钮

 

 上传成功后,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

 

4、Nuget包导入到dotnet模板,并建立新工程

一、使用nuget.org 的包ID进行分发

在上边发布成功了之后,咱们直接就能够经过 nuget 惟一包id,来进行导入dotnet 模板操做:

// 经过nuget.org ID 导入分发,这个名称,就是咱们以前在 nuspec 范本文件中,配置的nuget包 ID
dotnet new -i Blog.Core.Webapi.Template

 

而后就能够看到已经导入成功了,至于使用,就和以前的经过文件系统导入的是同样的:

 

 

 是否是很不错!彻底解放双手,也不依赖工具,就能够直接建立一套相同的项目,并能够自定义项目名:

不信的话,你能够在你电脑里执行下刚刚的那个模板导入命令(dotnet new -i Blog.Core.Webapi.Template),能够成功的导入到你的电脑里(注意必定要是管理员权限打开命令行窗口,若是报错,多是401权限问题,请在下方留言)。若是你用不了这个命令,证实你的电脑是没有最高权限的,那就请用下边的这个方法吧。

 

二、直接使用nupkg包来导入

若是你不能直接用 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

 

5、结语 

 今天我们主要讲解了如何把本身的源代码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模板信息

 

6、Github & Gitee

 

https://github.com/anjoy8/Blog.Core

https://gitee.com/laozhangIsPhi/Blog.Core