You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何发布到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命令正确识别该模板?


问题原因分析

  1. .template.config目录位置错误:dotnet new要求模板包的.template.config/template.json必须位于NuGet包的根目录,而当前配置将所有文件(包括.template.config)都打包到了content目录下,导致CLI无法检测到模板配置。
  2. NuGet标签配置缺失:.nuspec文件中tags未包含dotnet-new和template标签,GitHub Packages无法识别这是一个模板包。
  3. csproj配置错误:PublishRepositoryUrl是布尔值属性,被错误设置为URL地址;同时ProjectType是旧版属性,新版应使用PackageType。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:13:12