如何为含独立.template.config的.NET 8多项目解决方案创建NuGet模板
构建.NET 8解决方案级NuGet模板:整合已有项目模板的方法
核心结构搭建
首先在你的解决方案根目录下创建两个关键内容:.template.config目录(内含template.json),以及一个用于NuGet打包的.csproj文件。最终目录结构应该类似这样:
MySolutionTemplate/ ├── .template.config/ │ └── template.json ├── MySolutionTemplate.csproj ├── Project1/ # 你已有的带单独模板的项目 │ ├── .template.config/ │ │ └── template.json │ └── ...(项目文件) ├── Project2/ │ ├── .template.config/ │ │ └── template.json │ └── ... └── ...(剩下3个项目)
解决方案级template.json配置
这个文件是整合的核心,重点用sources字段关联你已有的项目模板,无需重复编写每个项目的专属配置。示例配置如下:
{ "$schema": "http://json.schemastore.org/template", "author": "你的名字/团队", "name": ".NET 8 完整解决方案模板", "shortName": "net8solntemplate", "tags": { "language": "C#", "type": "Solution", "platform": "NET8" }, "type": "Solution", "sources": [ { "source": "./Project1", "description": "项目1:业务逻辑层" }, { "source": "./Project2", "description": "项目2:数据访问层" }, { "source": "./Project3", "description": "项目3:API接口层" }, { "source": "./Project4", "description": "项目4:单元测试" }, { "source": "./Project5", "description": "项目5:集成测试" } ], "symbols": { // 定义全局共享符号,所有项目模板可复用 "SolutionName": { "type": "parameter", "description": "解决方案名称", "defaultValue": "MyEnterpriseSolution", "replaces": "__SolutionName__", "fileRename": "__SolutionName__" }, "RootNamespace": { "type": "parameter", "description": "所有项目的根命名空间", "defaultValue": "MyCompany.MySolution", "replaces": "__RootNamespace__" } } }
sources字段会自动读取每个项目下的.template.config/template.json,继承它们的符号、文件替换规则、参数等,完全复用你已有的项目模板配置。- 若需要全局覆盖某个项目的符号(比如统一命名空间),直接在解决方案级的
symbols里定义即可,优先级高于项目级配置。
打包用的.csproj配置
这个文件负责将整个解决方案模板打包成NuGet包,配置示例:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <PackageType>Template</PackageType> <PackageVersion>1.0.0</PackageVersion> <PackageId>MyCompany.Net8SolutionTemplate</PackageId> <Title>.NET 8 全栈解决方案模板</Title> <Authors>你的名字/团队</Authors> <Description>包含5个预配置项目的.NET 8解决方案模板,涵盖业务逻辑、数据访问、API及测试层</Description> <PackageTags>dotnet-template;solution;net8;csharp;enterprise</PackageTags> <TargetFramework>net8.0</TargetFramework> <IncludeContentInPack>true</IncludeContentInPack> <ContentTargetFolders>content</ContentTargetFolders> </PropertyGroup> <ItemGroup> <!-- 包含所有项目文件,排除编译输出和临时文件 --> <Content Include="**/*" Exclude="bin/**;obj/**;**/*.user;**/*.suo;**/*.csproj.nuget.dgspec.json" /> <!-- 确保模板配置文件被正确打包 --> <Content Include=".template.config/**/*" /> </ItemGroup> </Project>
测试与打包
- 本地测试模板:在解决方案根目录运行
dotnet new install .,然后用dotnet new net8solntemplate -n MyNewSolution生成新解决方案,检查所有项目是否正确生成、符号替换是否生效。 - 打包NuGet包:运行
dotnet pack,生成的.nupkg文件可发布到NuGet服务器,或直接在本地通过dotnet new install ./MyCompany.Net8SolutionTemplate.1.0.0.nupkg安装使用。
关键注意事项
- 项目级的
.template.json无需修改,解决方案级模板会自动继承它们的配置(比如项目专属的符号、文件过滤规则)。 - 如果某个项目需要独立的参数,依然可以在自己的
.template.json里定义,不会被解决方案级配置覆盖。 - 若要调整解决方案生成时的项目结构,可在解决方案级
template.json里添加postActions字段(比如自动添加项目到解决方案)。
内容的提问来源于stack exchange,提问作者Mike Lenart
相关产品推荐
相关产品推荐

