一、文件夹\项目结构

1.1、文件夹

net6.0:针对.net 6.0 项目模板

net6.0pack:针对net6.0打包

1.2、项目结构

Web\WebApi多项目、各层项目、单元测试项目

目标:制作Web\WebApi两个项目模板

二、模板参数

2.1、template\net6.0\.template.config\template.json

{"$schema": "http://json.schemastore.org/template","author": "yinyunpan","classifications": [ "Web", "WebApi" ],"name": "项目模板案例","identity": "sample.template","shortName": "st","tags": {"language": "C#",//解决方案,与HostIdentifier用法生成解决方案文件名呼应"type": "solution"},"sourceName": "sampletemplate","preferNameDirectory": false,//重新生成项目guid,对应template.sln中项目guid"guids": ["5A6E6B9F-F8FA-4152-95B4-860F8CCAE3C3","30B12CFC-11E1-4E1C-B484-F708CEBD080A","810CD02B-0E13-4123-A84F-FBD4F4F1CD3A","3D2A540B-E773-44FA-82CF-14F3393D41B2","F4C1EFA8-824C-4985-A50D-BD1171ED1CFC","41C74675-6234-41F2-9B8A-4D06159D2A81","5EAD3BC3-554B-4058-9A9D-A91DF5F2DE1C","8A522BE9-0EE5-4C54-861B-394452A6744E","F075845E-43F4-466D-B731-904782BD9047"],"symbols": {/**template.sln文件有用host,排除项目文件引用modifiers-condition,排除文件夹+文件**/"host": {"type": "parameter","datatype": "choice","choices": [{"choice": "web","description": "后台"},{"choice": "webapi","description": "接口"}],"defaultValue": "web","description": "项目类型","displayName": "项目类型","isRequired": true},"web": {"type": "computed","value": "(host == \"web\")"},"webapi": {"type": "computed","value": "(host == \"webapi\")"},//应用的环境变量"appUK": {"type": "parameter","datatype": "string","description": "应用标识","displayName": "应用标识","isRequired": true,"replaces": "wutong.netcore.sampletemplate"},"kestrelHttpPort": {"type": "parameter","datatype": "integer","description": "启动配置文件的http端口","displayName": "http端口"},"kestrelHttpPortGenerated": {"type": "generated","generator": "port","parameters": {"low": 5000,"high": 5300}},"kestrelHttpPortReplacer": {"type": "generated","generator": "coalesce","parameters": {"sourceVariableName": "kestrelHttpPort","fallbackVariableName": "kestrelHttpPortGenerated"},//与launchSettings.json端口一致,才能随机生成替换"replaces": "5000"},//模板主机标识"HostIdentifier": {"type": "bind","binding": "HostIdentifier"}},"sources": [{"exclude": [ ".template.config/**/*", ".vs/**/*" ],"modifiers": [{"condition": "(web)","exclude": [ "src/WebApi/**/*", "test/WebApiUnitTest/**/*" ]},{"condition": "(webapi)","exclude": [ "src/Web/**/*", "test/WebUnitTest/**/*" ]},{/**visual studio创建模板会自动生成新的解决方案文件.sln、与模板下{sourceName}.sln冲突,导致生成visual studio提醒外部文件变化重新加载,操作不友好判断使用模板主机标识:vs-visual studio、dotnetcli\dotnetcli-preview-命令窗口模板下解决方案文件名要非{sourceName}.sln,命令窗口重命名参考:https://github.com/sayedihashimi/template-sample/tree/main/src/Samples/06-console-csharp-fsharp**/"condition": "(HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\")","rename": {"template.sln": "sampletemplate.sln"}}]}]
}

总结:

  host定义项目类型,方便使用在host基础上定义web、webapi计算型布尔变量。

  项目开发中本地启动文件(launchSettings.json)中会经常用环境变量,如:应用标识。

  模板文件中关键字替换依赖环境变量的replaces参数,需要注意保证replaces的值与文件被替换的值一样,如:http端口、应用标识。

  根据项目类型,排除web\webapi对应的项目以及单元测试项目文件。

  如果需要区分当前使用模板场景(visual studio 可视化窗口、命令行窗口),有不同执行行为,可以使用HostIdentifier变量。如:解决文件.sln生成。

  

2.2、template\net6.0\.template.config\ide.host.json

{"$schema": "http://json.schemastore.org/vs-2017.3.host","order": 200,"icon": "ide/sampletemplate.png","symbolInfo": [{"id": "host","isVisible": true},{"id": "appUK","isVisible": true},//隐藏http端口,自动生成{"id": "kestrelHttpPort","isVisible": false}]
}

2.3、template\net6.0\.template.config\dotnetcli.host.json

{"$schema": "http://json.schemastore.org/dotnetcli.host","symbolInfo": {"host": {"isHidden": false},"appUK": {"isHidden": false},//隐藏http端口,自动生成"kestrelHttpPort": {"isHidden": true}}
}

三、解决方案文件设置


Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32414.318
MinimumVisualStudioVersion = 10.0.40219.1
<!--#if(web)-->
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web", "src\Web\Web.csproj", "{F075845E-43F4-466D-B731-904782BD9047}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebUnitTest", "test\WebUnitTest\WebUnitTest.csproj", "{8A522BE9-0EE5-4C54-861B-394452A6744E}"
EndProject
<!--#endif-->
<!--#if(webapi)-->
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApi", "src\WebApi\WebApi.csproj", "{5A6E6B9F-F8FA-4152-95B4-860F8CCAE3C3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApiUnitTest", "test\WebApiUnitTest\WebApiUnitTest.csproj", "{5EAD3BC3-554B-4058-9A9D-A91DF5F2DE1C}"
EndProject
<!--#endif-->
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "src\Shared\Shared.csproj", "{30B12CFC-11E1-4E1C-B484-F708CEBD080A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Domain.Interfaces", "src\Domain.Interfaces\Domain.Interfaces.csproj", "{810CD02B-0E13-4123-A84F-FBD4F4F1CD3A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Domain.Service", "src\Domain.Service\Domain.Service.csproj", "{3D2A540B-E773-44FA-82CF-14F3393D41B2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure.Interfaces", "src\Infrastructure.Interfaces\Infrastructure.Interfaces.csproj", "{F4C1EFA8-824C-4985-A50D-BD1171ED1CFC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure.Implements", "src\Infrastructure.Implements\Infrastructure.Implements.csproj", "{41C74675-6234-41F2-9B8A-4D06159D2A81}"
EndProject
GlobalGlobalSection(SolutionConfigurationPlatforms) = preSolutionDebug|Any CPU = Debug|Any CPURelease|Any CPU = Release|Any CPUEndGlobalSectionGlobalSection(ProjectConfigurationPlatforms) = postSolution
<!--#if(web)-->{F075845E-43F4-466D-B731-904782BD9047}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{F075845E-43F4-466D-B731-904782BD9047}.Debug|Any CPU.Build.0 = Debug|Any CPU{F075845E-43F4-466D-B731-904782BD9047}.Release|Any CPU.ActiveCfg = Release|Any CPU{F075845E-43F4-466D-B731-904782BD9047}.Release|Any CPU.Build.0 = Release|Any CPU{8A522BE9-0EE5-4C54-861B-394452A6744E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{8A522BE9-0EE5-4C54-861B-394452A6744E}.Debug|Any CPU.Build.0 = Debug|Any CPU{8A522BE9-0EE5-4C54-861B-394452A6744E}.Release|Any CPU.ActiveCfg = Release|Any CPU{8A522BE9-0EE5-4C54-861B-394452A6744E}.Release|Any CPU.Build.0 = Release|Any CPU
<!--#endif-->
<!--#if(webapi)-->{5A6E6B9F-F8FA-4152-95B4-860F8CCAE3C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{5A6E6B9F-F8FA-4152-95B4-860F8CCAE3C3}.Debug|Any CPU.Build.0 = Debug|Any CPU{5A6E6B9F-F8FA-4152-95B4-860F8CCAE3C3}.Release|Any CPU.ActiveCfg = Release|Any CPU{5A6E6B9F-F8FA-4152-95B4-860F8CCAE3C3}.Release|Any CPU.Build.0 = Release|Any CPU    {5EAD3BC3-554B-4058-9A9D-A91DF5F2DE1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{5EAD3BC3-554B-4058-9A9D-A91DF5F2DE1C}.Debug|Any CPU.Build.0 = Debug|Any CPU{5EAD3BC3-554B-4058-9A9D-A91DF5F2DE1C}.Release|Any CPU.ActiveCfg = Release|Any CPU{5EAD3BC3-554B-4058-9A9D-A91DF5F2DE1C}.Release|Any CPU.Build.0 = Release|Any CPU
<!--#endif-->{30B12CFC-11E1-4E1C-B484-F708CEBD080A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{30B12CFC-11E1-4E1C-B484-F708CEBD080A}.Debug|Any CPU.Build.0 = Debug|Any CPU{30B12CFC-11E1-4E1C-B484-F708CEBD080A}.Release|Any CPU.ActiveCfg = Release|Any CPU{30B12CFC-11E1-4E1C-B484-F708CEBD080A}.Release|Any CPU.Build.0 = Release|Any CPU{810CD02B-0E13-4123-A84F-FBD4F4F1CD3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{810CD02B-0E13-4123-A84F-FBD4F4F1CD3A}.Debug|Any CPU.Build.0 = Debug|Any CPU{810CD02B-0E13-4123-A84F-FBD4F4F1CD3A}.Release|Any CPU.ActiveCfg = Release|Any CPU{810CD02B-0E13-4123-A84F-FBD4F4F1CD3A}.Release|Any CPU.Build.0 = Release|Any CPU{3D2A540B-E773-44FA-82CF-14F3393D41B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{3D2A540B-E773-44FA-82CF-14F3393D41B2}.Debug|Any CPU.Build.0 = Debug|Any CPU{3D2A540B-E773-44FA-82CF-14F3393D41B2}.Release|Any CPU.ActiveCfg = Release|Any CPU{3D2A540B-E773-44FA-82CF-14F3393D41B2}.Release|Any CPU.Build.0 = Release|Any CPU{F4C1EFA8-824C-4985-A50D-BD1171ED1CFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{F4C1EFA8-824C-4985-A50D-BD1171ED1CFC}.Debug|Any CPU.Build.0 = Debug|Any CPU{F4C1EFA8-824C-4985-A50D-BD1171ED1CFC}.Release|Any CPU.ActiveCfg = Release|Any CPU{F4C1EFA8-824C-4985-A50D-BD1171ED1CFC}.Release|Any CPU.Build.0 = Release|Any CPU{41C74675-6234-41F2-9B8A-4D06159D2A81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{41C74675-6234-41F2-9B8A-4D06159D2A81}.Debug|Any CPU.Build.0 = Debug|Any CPU{41C74675-6234-41F2-9B8A-4D06159D2A81}.Release|Any CPU.ActiveCfg = Release|Any CPU{41C74675-6234-41F2-9B8A-4D06159D2A81}.Release|Any CPU.Build.0 = Release|Any CPUEndGlobalSectionGlobalSection(SolutionProperties) = preSolutionHideSolutionNode = FALSEEndGlobalSectionGlobalSection(ExtensibilityGlobals) = postSolutionSolutionGuid = {2A1729E7-0ED9-48D5-84EB-897B28B15D78}EndGlobalSection
EndGlobal

总结:

  根据项目类型,保留对应项目引用。

四、开发测试

4.1、打包项目文件

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><PackageType>Template</PackageType><PackageVersion>1.0.0.1</PackageVersion><PackageId>sample.template</PackageId><Title>项目模板案例</Title><Authors>flightengine</Authors><Description>项目模板案例</Description><PackageTags>dotnet-new;templates</PackageTags><TargetFramework>net6.0</TargetFramework><IncludeContentInPack>true</IncludeContentInPack><IncludeBuildOutput>false</IncludeBuildOutput><ContentTargetFolders>content</ContentTargetFolders></PropertyGroup><ItemGroup><!--PackagePath="content" 保持文件夹\文件的层级结构,否则所有文件都在根目录--><Content Include="..\net6.0\**\*" PackagePath="content" Exclude="..\net6.0\**\bin\**;..\net6.0\**\obj\**;..\net6.0\**\.vs\**" /><Compile Remove="..\net6.0\**\*" /></ItemGroup>
</Project>

总结:

  PackagePath定义很重要❗❗❗

4.2、编译打包

net6.0pack文件夹下执行:

dotnet pack 

4.3、安装包

dotnet new --install sample.template.1.0.0.1.nupkg

生成到 net6.0pack\bin\Debug 文件夹

4.4、卸载包

dotnet new --uninstall sample.template

开发中修改后,先执行卸载再安装模板,后vs或者cli测试。

4.5、安装

visual studio:

勾选避免生成的代码层次与模板项目定义不一致。

4.6、上传

执行批处理文件

@echo off
:: 解决中文乱码
chcp 65001
set PackageVersion="1.0.0.1"
del .\PublishNuget\*.nupkgdotnet clean .\net6.0pack.csproj
dotnet pack .\net6.0pack.csproj -p:PackageVersion=%PackageVersion% -c Release -o .\PublishNuget:: dotnet nuget push  上传包源服务器pause

生成到 net6.0pack\PublishNuget 文件夹,可以再结合上传包源服务器命令。

五、案例源码

https://github.com/yinyunpan/template

六、参考

6.1、官方或者第三方包参考

https://dotnetnew.azurewebsites.net/

搜索包,然后到 https://www.nuget.org/ 下载,分析别人是如何实现的。

6.2、文档

https://github.com/dotnet/templating/wiki/Reference-for-template.json

官网文档各个参数含义,有些特殊参数注释\案例写不是很明白。

asp.net core web 解决方案多项目模板制作打包总结相关推荐

  1. ASP.NET Core Web多语言项目

    公司效益好了,准备和国外做生意,这个时候就需要多语言了. > 1. 这是一个ASP.NET Core Web多语言项目,主要展示项目的不同: > 2. 第一种:www.xxx.com/en ...

  2. VS2017创建ASP.NET Core Web程序

    创建ASP.NET Core Web应用程序 如果您使用的是VS2019 请看 VS2019创建ASP.NET Core Web程序 在这个视频中我们将讨论 可用的不同项目模板及其功能 预制的项目模板 ...

  3. ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment(https://github.com/Essensoft/Pa ...

  4. Asp.Net Core Web应用程序—探索

    前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准( ...

  5. ASP.NET Core 实战:使用ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

    一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...

  6. core webapi缩略图_在ASP.NET Core Web API 项目里无法访问(wwwroot)下的文件

    新建 ASP.NET Core Web API 项目 -- RESTFul 风格 Hello World! 一.创建一个空项目 请查看 新建 .NET Core 项目 -- Hello World!  ...

  7. ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

    今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了: ASP.NET Core 2.1 做API Identity Server 4 Ang ...

  8. abp .net core linux,Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application-笔记

    参考 abp vnext框架 从空项目开始 使用asp.net core web application rynowak的回答 migrate from asp.net core 2.2 to 3.0 ...

  9. ASP.NET Core Web项目连接MySQL数据库

    作者在新建了一个ASP.NET Core Web项目的基础上,想连接本地的Mysql数据库,参考了很多博客,各种各样的说法都有,多少让人有感凌乱!自己最后捣鼓成功了!所以写一篇博客,以便后人查阅! 操 ...

最新文章

  1. 接口测试要如何做数据准备
  2. Linux字符模式下的“远程桌面共享”及屏幕录制
  3. 如何安装mysql5.5.6_centos6安装mysql5.5.53
  4. 20天掌握C语言,C语言零基础到项目实战,玩转C语言
  5. Hive中生成随机唯一标识ID的方法
  6. retrofitWrap
  7. matlab现值与终值函数_个人家庭投资理财基础(二 单利、复利、终值、现值、内部收益率)...
  8. checkbox取反
  9. nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅
  10. C++_class Template about Stack(使用类模板实现栈操作)
  11. IBM X3650优盘启动
  12. CSDN图片去除水印
  13. 软件破解逆向安全(十二)内存特征码
  14. cygwin3下编译redis6.2
  15. 【给初学者,大佬见笑】100%成功UEFI安装双硬盘单系统Ubuntu最合理分区安装指南+ubuntu20.04安装
  16. C#加密Excel文件
  17. 笔记本液晶屏改装显示器
  18. 2022新PHP赞/易支付系统源码+全新UI界面
  19. android 日倒计时计算器,DAILY DAY app
  20. 正大国际琪貨纯手:“恒指期货”怎么交易?

热门文章

  1. ESP32设备驱动-MMA7455L加速计驱动
  2. C语言学习-调用自定义函数
  3. 《学习总章》硬件工程师学习首页
  4. scrum认证费用_如何获得专业Scrum大师的认证-快速和慢速方式
  5. 专业计算机术语中英文对照(一)
  6. 【机器学习】 随机森林(Random Forest)
  7. windows在此计算机上找不到系统映象,win7系统在恢复系统印象时找不到映像文件 – 手机爱问...
  8. 报错Caused by: java.lang.IllegalStateException: duplicate key: spring
  9. 前端大屏适配几种方案
  10. 大数据开发教程——构建Hadoop开发环境