为何发布到GitHub Packages的.NET模板被识别为普通NuGet包?
.NET DDD Web API模板发布到GitHub Packages后无法被dotnet new识别的问题修复
我为采用DDD架构的Web API项目创建了.NET模板,发布到GitHub Packages后,该模板被识别为标准NuGet包,而非dotnet new可使用的模板。以下是我的配置详情,请求排查问题并给出修复方案:
.csproj配置
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <PackageId>MyCompanyTemplate</PackageId> <Title>MyCompany Template (Web Api DDD)</Title> <Authors>MyCompany S.r.l.</Authors> <Description>Template for Web Api DDD</Description> <PackageTags>dotnet-new;template;webapi;ddd;mycompany</PackageTags> <TargetFramework>net8.0</TargetFramework> <ProjectType>Template</ProjectType> <RepositoryUrl>https://github.com/mycompany/mycompany</RepositoryUrl> <PublishRepositoryUrl>https://nuget.pkg.github.com/mycompany</PublishRepositoryUrl> <NuspecFile>MyCompanyTemplate.nuspec</NuspecFile> <IncludeContentInPack>true</IncludeContentInPack> <IncludeBuildOutput>false</IncludeBuildOutput> <ContentTargetFolders>content</ContentTargetFolders> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> </PropertyGroup> <ItemGroup> <Content Include="src\**\*;test\**\*;*.sln;.template.config\**" Exclude="src\**\bin\**;test\**\bin\**" /> <Compile Remove="**\*" /> </ItemGroup> </Project>
.nuspec配置
<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MyCompanyTemplate</id> <title>ASP.NET Core Web Api template</title> <version>0.0.1</version> <authors>MyCompany S.r.l.</authors> <description> First version of a web api template. </description> <language>it-IT</language> <license type="expression">MIT</license> <projectUrl>https://github.com/mycompany/MyCompanyTemplate</projectUrl> <releaseNotes> * FIRST RELEASE! </releaseNotes> <packageTypes> <packageType name="Template" /> </packageTypes> <tags>Web ASP.NET</tags> </metadata> <files> <file src=".\**" target="content" exclude=".\bin\**;.\obj\**;.\.git\**;.\.github\**;.\.user;.\.vs\**;.\.vscode\**;.\.idea\**" /> </files> </package>
template.json配置
{ "$schema": "http://json.schemastore.org/template", "author": "MyCompany S.r.l.", "classifications": ["Web", "DDD", "Api", "MyCompany"], "identity": "MyCompanyTemplate", "name": "MyCompany Template", "shortName": "mycompanytemplate", "tags": { "language": "C#", "type": "solution" }, "sourceName": "MyCompanyTemplate", "preferNameDirectory": true, "sources": [ { "modifiers": [ { "exclude": [ ".vs/**", ".template.config/**", ".git/**", "./.DS_Store", ".idea/**", "./Template.csproj", "./global.json", ".github/**", "README.md", "./**/bin/**", "./**/obj/**", "nupkgs/**" ] } ] } ] }
GitHub Actions发布脚本(publish.yml)
name: Publish Template on: push: branches: - master workflow_dispatch: jobs: build-and-publish: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v3 - name: Setup .NET uses: actions/setup-dotnet@v3 with: dotnet-version: "8.0" - name: Restore Dependencies run: dotnet restore MyCompanyTemplate.csproj - name: Build Template run: dotnet pack MyCompanyTemplate.csproj --configuration Release - name: Publish to GitHub Packages run: dotnet nuget push bin/Release/*.nupkg -k ${{ secrets.SECRET }} -s https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json
问题
为何我的.NET CLI模板发布到GitHub Packages后被识别为普通NuGet包?如何修复才能让dotnet new命令正确识别该模板?
问题原因分析
- .template.config目录位置错误:
dotnet new要求模板包的.template.config/template.json必须位于NuGet包的根目录,而当前配置将所有文件(包括.template.config)都打包到了content目录下,导致CLI无法检测到模板配置。 - NuGet标签配置缺失:
.nuspec文件中tags未包含dotnet-new和template标签,GitHub Packages无法识别这是一个模板包。 - csproj配置错误:
PublishRepositoryUrl是布尔值属性,被错误设置为URL地址;同时ProjectType是旧版属性,新版应使用PackageType。 - csproj与nuspec配置冲突:同时使用csproj的打包配置和自定义nuspec文件,容易导致内容打包规则冲突。
修复方案
1. 修正.nuspec配置
调整文件打包规则
将.template.config单独打包到包根目录,其余文件打包到content:
<files> <!-- 将.template.config放到包根目录 --> <file src=".template.config/**" target=".template.config" /> <!-- 其余文件放到content目录,排除.template.config --> <file src=".\**" target="content" exclude=".\bin\**;.\obj\**;.\.git\**;.\.github\**;.\.user;.\.vs\**;.\.vscode\**;.\.idea\**;.\.template.config\**" /> </files>
补充模板标签
更新tags节点,添加模板识别所需标签:
<tags>dotnet-new;template;webapi;ddd;mycompany;Web;ASP.NET</tags>
2. 修正.csproj配置
修复PublishRepositoryUrl属性
将其改为布尔值:
<PublishRepositoryUrl>true</PublishRepositoryUrl>
替换旧版ProjectType属性
使用新版PackageType属性(与nuspec的packageTypes保持一致):
<!-- 移除<ProjectType>Template</ProjectType> --> <PackageType>Template</PackageType>
可选:移除NuspecFile,统一用csproj配置
如果不想维护两份配置,可以删除<NuspecFile>MyCompanyTemplate.nuspec</NuspecFile>,并在csproj中配置所有打包规则,避免冲突。
3. 优化GitHub Actions脚本
dotnet pack会自动执行build,可移除单独的build步骤,提升效率:
- name: Pack Template run: dotnet pack MyCompanyTemplate.csproj --configuration Release --no-restore
4. 验证模板包
打包完成后,可以本地安装测试:
dotnet new install ./bin/Release/MyCompanyTemplate.0.0.1.nupkg
执行dotnet new list查看是否能看到你的模板,确认无误后再发布到GitHub Packages。
内容的提问来源于stack exchange,提问作者gdetra
相关产品推荐
相关产品推荐

