标题: 从零开始实现 ASP.NET Core MVC 的插件式开发 (二) - 如何创建项目模板
作者: Lamond Lu
地址: https://www.cnblogs.com/lwqlun/p/11155666.html
源代码: https://github.com/lamondlu/DynamicPlugins
在上一篇中, 我们介绍了通过一个最简单了例子, 给大家演示了一下, 如何在 ASP.NET Core Mvc 中借助 ApplicationPart 来开发一个插件. 在文章的最后, 我们也提出了一些待解决的问题.
首先呢, 第一个要解决问题是, 每次我们创建一个新的插件, 每次都要重新创建项目, 添加类库引用, 以及手动修改 csproj 文件, 非常的繁琐. 那么有没有一种方式可以减少这部分操作的?
回想一下, 当我们每次使用 Visual Studio 创建项目的时候, 我们都可以选择一个项目模板, Visual Studio 不仅可以根据我们选择的模板创建出项目, 而且我们所需的程序集引用都会预先配置好, 不需要我们重复配置了. 那么我们是否可以自己创建一些模板呢? 答案是肯定的.
本文中, 我就来给大家演示一下, 在如何为. NET Core 项目创建项目模板, 简化操作流程.
编写 template.JSON
如果要创建一个项目模板, 我们需要做 2 件事情.
创建一份项目代码作为模板
编写 template.JSON 文件
这里我们之前已经创建了一个 DemoPlugin1 的项目了, 所以这次我们可以直接将其转换成一个模板项目.
首先我们在当前项目中添加一个 .template.config 目录, 并在其中添加一个 template.JSON 文件. 内容如下:
- {
- "author": "Lamond Lu",
- "classifications": [ "web/Plugins" ],
- "name": "DemoPlugin1",
- "identity": "LamondDynamicPlugins",
- "shortName": "ldp",
- "tags": {
- "language": "C#" ,
- "type":"project"
- },
- "sourceName": "DemoPlugin1",
- "preferNameDirectory": true
- }
配置说明:
Author 属性指明了模板的作者, 必填
classifications 属性指明了模板的分类, 必填
name 表示模板的名称, 当你使用 dotnet new 创建项目时, 指定的模板名称, 必填
identity 表示模板的唯一名称, 可选
shortName 表示模板的简短名称, 必填
tags 为当前模板指定了一些标签
sourceName 指定了一个字符串, 当使用 dotnet new 指定 - n 参数的时候,-n 参数的值, 会替换 sourceName 指定的字符串. 以当前项目为例, 我们的项目文件名称和所有使用的命名空间都是 DemoPlugin1, 但是如果我们生成新的项目不可能都是用这个名字, 所以我们需要使用 - n 参数指定的项目名来替换 "DemoPlugin1", 如果当前 dotnet new 命令指定的 - n 参数值为 DemoPlugin2, 当项目创建成功时候, 项目中所有的命名空间以及项目文件名称, 都会使用新的 DemoPlugin2
preferNameDirectory
, 是否生成相同名称的目录, 可选.
针对 template.JSON 的详细配置列表, 有兴趣的同学可以查看一下链接 < https://github.com/dotnet/templating/wiki/Reference-for-template.json>
使用 dotnet-CLI 创建模板
编写完代码之后, 我们就可以使用如下 dotnet-CLI 的命令来安装项目模板了.
dotnet new -i <PATH>
这里 < PATH > 指定了当前模板项目所在的目录
运行命令之后, 会输出一个最新的本地模板列表, 我们可以发现 DemoPlugin1 已经作为模板出现在了列表中.
使用 dotnet new 创建项目
当模板安装到本地之后, 我们就可以使用 dotnet new 命令来创建项目了, 比如我们现在要创建一个新的插件, 我们就可以使用如下命令.
dotnet new ldp -n DemoPlugin2
运行命令之后, 对应的代码就生成出来了. 来到项目目录中, 我们发现之前的 DemoPlugin1.csproj 文件已经被更名为 DemoPlugin2.csproj, 这说明之前在 template.JSON 文件中指定的 sourceName 属性帮我我们正确的替换了项目文件名.
随后, 我们可以在查看一个代码中唯一个控制器, 其命名空间也被正确替换了.
怎么样? 这样是不是比之前手动的方式简单的很多?
注: 如果你想要卸载刚刚安装的模板, 你需要使用 dotnet new --debug:reinit 命令, 这里使用 dotnet new -u 命令是无法卸载的, dotnet new -u 只适用与从 nuget.org 下载下来的模板包
如何将模板打包成 Nuget 包
除了以上这种使用项目目录创建项目模板的方式, 我们还可以将模板打包成 Nuget 包供其他人使用.
如果要创建一个模板, 这里首先我们需要创建一个 Nuget 包的元数据文件, 这里我们命名为 LamondDynamicPlugin.nuspec
- <?xml version="1.0" encoding="utf-8"?>
- <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
- <metadata>
- <id>LamondDynamicPlugin</id>
- <version>1.0.0</version>
- <description>
- Creates dynamic plugin in ASP.NET core
- </description>
- <authors>Lamond Lu</authors>
- <packageTypes>
- <packageType name="Template" />
- </packageTypes>
- </metadata>
- </package>
这里设置的属性都很简单, 唯一需要注意的 packageType 一定要设置成 Template.
编写好元数据文件之后, 我们就可以使用 Nuget pack 命令来打包了, 这个命令的第一个参数就是指定一个. nuspec 文件所在的路径.
nuget pack DemoPlugin1/LamondDynamicPlugin.nuspec
运行之后, Nuget 会生成一个 LamondDynamicPlugin.nupkg 文件, 这个就是我们所说的 Nuget 包了.
为了使用 Nuget 包的方式安装模板, 我们可以使用相同的命令 dotnet new -i
dotnet new -i LamondDynamicPlugin.nupkg
当然, 通常来说我们都会将这个 Nuget 包发布到 nuget.org, 这样就可以将这个模板分享给其他人了.
发布到 Nuget 之后, 我们就可以使用 LamondDynamicPlugin.nuspec 中定义的唯一 id 来安装模板了. 安装的命令和之前从目录安装模板是一样的.
dotnet new -i LamondDynamicPlugin
如果你想卸载某个模板, 只需要使用 dotnet new -u [Nuget 包] 即可.
dotnet new -u LamondDynamicPlugin
总结
本文中我演示了如何使用 dotnet-CLI 创建一个. NET Core 的项目模板, 以及如何使用 Nuget 来打包项目模板供其他人使用, 这样就解决了我们之前手动创建插件项目繁琐的问题. 下一期, 我会尝试将模块的业务逻辑抽象出来, 创建一个核心类库, 大家敬请期待.
来源: https://www.cnblogs.com/lwqlun/p/11155666.html