使用 .NET CLI 构建项目脚手架

前言
在微服务场景中,开发人员分配到不同的小组,系统会拆分为很多个微服务,有一点是,每个项目都需要单元测试,接口文档,WebAPI接口等,创建新项目这些都是重复的工作,而且还要保证各个项目结构的大体一致,这时就需要一个适用于企业内部的框架模板,类似于前端的脚手架,可以做到开箱即用,注重业务功能开发,提升工作效率。
简介
NET 命令行接口 (CLI) 工具是用于开发、生成、运行和发布 .NET 应用程序的跨平台工具链。
本次主要介绍的是 dotnet new 命令,可以通过这个命令创建我们的自定义模板,我们安装完.NET SDK后,本身自带了一些项目模板,可以通过 dotnet new --list 查看已经安装的模板。

接下来,我会介绍如何构建自定义的项目模板。
准备工作
首先,我们需要准备一个简单的项目模板,我们希望以后可以通过脚手架,自动为我们生成这些项目和文件,这里面可能包含了单元测试项目,WebAPI项目等。
你也可以在这里找到项目源代码,https://github.com/SpringLeee/Dy.Template
在本地创建 Dy.Template 文件夹,并在文件夹内创建 templates 文件夹(后边所有的模板文件都在这里), 这里我创建了一个解决方案,里面包含了3个项目,WebAPI,Test 和 Task,项目结构如下:


构建模板
在 templates 文件夹内,创建一个名为 ".template.config" 的文件夹(可以通过命令 mkdir .template.config 创建, 然后进入该文件夹,再创建一个名为 "template.json" 的新文件, 文件夹结构应如下所示:

然后修改配置文件如下:
{
"$schema": "http://json.schemastore.org/template",
"author": "SpringLee",
"classifications": [ "Template" ],
"name": "Dy.Template",
"identity": "Dy.Template",
"shortName": "dy-template",
"tags": {
"language": "C#"
},
"sourceName": "Template"
}
上面是一些基本的描述信息,需要注意的是 "sourceName" 属性,它相当于一个变量,我们通过这个属性,可以创建 Dy.Order.WebAPI, Dy.User.WebAPI 这样的项目,后边我会进行详细介绍。
打包模板
基础工作已经准备完成,我们还需要把项目打包,发布到Nuget.org 或者是公司的内部 Nuget Server,这样其他人才可以下载和安装这个模板。
你可能很熟悉在.NET 中对单个项目进行打包,比如类库,可以在VS中直接对项目使用右键打包,也可以使用dotnet pack命令,不一样的是,我们需要打包的是整个项目结构,而不是单个项目。
我们在 Dy.Template 文件夹下,创建 template-pack.csproj 文件

修改内容如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<PackageType>Template</PackageType>
<PackageVersion>1.0.0</PackageVersion>
<PackageId>Dy.Template</PackageId>
<Title>Dy.Template</Title>
<Authors>SpringLee</Authors>
<Description>Dy.Template</Description>
<PackageTags>dotnet-new;templates;Dy.Template</PackageTags>
<TargetFramework>netstandard2.0</TargetFramework>
<IncludeContentInPack>true</IncludeContentInPack>
<IncludeBuildOutput>false</IncludeBuildOutput>
<ContentTargetFolders>content</ContentTargetFolders>
<NoWarn>$(NoWarn);NU5128</NoWarn>
</PropertyGroup>
<ItemGroup>
<Content Include="templates\**\*" Exclude="templates\**\bin\**;templates\**\obj\**" />
<Compile Remove="**\*" />
</ItemGroup>
</Project>
我们指定了程序包的基础信息,版本ID, 描述信息,包含了 templates 文件夹下的所有文件,然后排除了 bin\ obj\ 文件夹的dll文件。
然后,运行 dotnet pack 命令进行打包, 你可以在 /bin/nuget/ 文件夹找到 生成的 nupkg 文件

在win10的应用商店(Microsoft Store)安装 Nuget Package Explore

我们把生成的 nupkg 文件 丢到 Nuget Package Explore 里查看,结构如下,包含了我们的 .config 配置文件,各个项目,解决方案。

最后,你可以把程序包推送到 nuget 服务器。
安装并使用
在终端中运行 dotnet new --install Dy.Template 命令安装,安装成功后,应该可以看到下边的输出,里边包含了我们的自定义模板

运行 dotnet new Dy.Template --name=Order,--name 指定了变量值,它会自动帮我们生成 Order 项目,这很棒!


欢迎扫码关注我们的公众号 【全球技术精选】,专注国外优秀博客的翻译和开源项目分享。

使用 .NET CLI 构建项目脚手架的更多相关文章
- VUE学习笔记之vue cli 构建项目
一.环境搭建: 1.安装node.js 从node.js官网下载并安装node,安装过程很简单,一路"下一步"就可以了.安装完成之后,打开命令行工具(win+r,然后输入cmd), ...
- 飞扬起舞,基于.Net Cli亲手打造.Net Core团队的项目脚手架
什么是脚手架? Scaffolding is a meta-programming method of building database-backed software applications. ...
- vue-cli脚手架构建项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. 一.安装node.js 二.安装vue-cli npm install -g vue-cl ...
- 解决使用脚手架构建项目缺失node_modules文件夹文件问题
昨晚,在教我前端交流群里面的朋友搭建vue开发环境和构建vue项目的时候发现我自己之前能正常构建vue项目的现在却不行了,排查之下发现 通过脚手架构建项目的时候项目缺失了node_modules文件夹 ...
- 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)
github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...
- vue/cli 3.0脚手架搭建
在vue 2.9.6中,搭建vue-cli脚手架的流程是这样的: 首先 全局安装vue-cli,在cmd中输入命令: npm install --global vue-cli 安装成功: 安装完成 ...
- Vue:Vue-Cli 实现的交互式的项目脚手架
一.这份文档是对应 @vue/cli.老版本的 vue-cli 文档请移步https://github.com/vuejs/vue-cli/tree/v2#vue-cli-- Vue CLI 是一个基 ...
- 简单vue项目脚手架
简单vue项目脚手架 github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-ro ...
- gulp进阶构建项目由浅入深
gulp进阶构建项目由浅入深 阅读目录 gulp基本安装和使用 gulp API介绍 Gulp.src(globs[,options]) gulp.dest(path[,options]) gulp. ...
随机推荐
- spring再学习之简单测试
一.spring是怎么工作的那,通过一个类装载进容器进行描述: 首先创建一个类user: package cn.itcast.bean; public class User { public User ...
- 全局ID生成--雪花算法改进版
存在的问题 时间回拨问题:由于机器的时间是动态的调整的,有可能会出现时间跑到之前几毫秒,如果这个时候获取到了这种时间,则会出现数据重复 机器id分配及回收问题:目前机器id需要每台机器不一样,这样的方 ...
- RT-Thread学习笔记1-启动顺序与线程创建
目录 1. 启动顺序 2. 堆范围 3. 线程创建 3.1 线程代码(入口函数) 3.2 线程控制块 3.3 线程栈 4. 系统滴答时钟 5. GPIO驱动架构操作IO 6. 线程优先级 & ...
- es6 curry function
es6 curry function // vuex getters export const getAdsFilterConfig = (state) => (spreader) => ...
- CSS :nth-of-type() bug
CSS :nth-of-type() bug .tools-hover-box-list-item { pointer-events: auto; box-sizing: border-box; di ...
- Apple Watch Series 6 屏幕误触放大后无法还原问题和解决方案
Apple Watch Series 6 屏幕误触放大后无法还原问题和解决方案 shit Apple,只能放大,不能缩小! 解决方案 关闭缩放功能 https://support.apple.com/ ...
- Swift 5.3 All In One
Swift 5.3 All In One refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- Python Coding Interview
Python Coding Interview Python Advanced Use enumerate() to iterate over both indices and values Debu ...
- http cache & 浏览器缓存,存储位置的优先级,条件?
http cache & 浏览器缓存,存储位置的优先级,条件? memory cache disk cache 浏览器缓存,存储位置的优先级,条件, 机制,原理是什么? from memory ...
- flutter web in action
flutter web in action flutter for web https://flutter.dev/web https://flutter.dev/docs/get-started/w ...