---
url: /zh/artifact/nuget.md
description: |
  介绍如何配置和使用 CNB NuGet 制品库， 包括 dotnet CLI 和 nuget.exe 两种客户端的凭证配置、包的推送和安装方法。
---
## 前置准备

1. [创建制品库](./intro.md#创建制品库)

2. [获取制品库的地址](./intro.md#获取制品库的地址)

3. [创建令牌](./intro.md#创建访问令牌)

## 本地使用

### 客户端说明

| 客户端/工具 | dotnet CLI                         | nuget.exe                  |
|:------------|:-----------------------------------|:---------------------------|
| 适用场景    | .NET Core/.NET 5+ 项目             | 传统 .NET Framework 项目   |
| 跨平台支持  | 原生支持                           | 需 Mono                    |
| 安装        | 随 .NET SDK 自动安装，无需单独配置 | 需要下载 nuget.exe 安装    |

### 凭据管理命令

使用 CNB 的访问令牌作为登录凭据，配置命令如下：

#### dotnet CLI

##### 1. 配置用户名/密码凭据

替换 `<YOUR_TOKEN>` 为访问令牌，`<SOURCE_NAME>` 为自定义源名称，`<REPO_URL>` 为制品库地址：

```bash
dotnet nuget add source <REPO_URL> --name <SOURCE_NAME> \
  --username cnb --password <YOUR_TOKEN> --store-password-in-clear-text
# 示例：添加凭据 cnb-nuget-repo
# dotnet nuget add source https://nuget.cnbprod.alpha.qq.com/cnb/nuget-repo/-/packages/v3/index.json \
#   --name cnb-nuget-repo --username cnb --password <YOUR_TOKEN> --store-password-in-clear-text
```

##### 2. 查看所有凭据

```bash
dotnet nuget list source
```

##### 3. 删除凭据

替换 `<SOURCE_NAME>` 为自定义源名称：

```bash
dotnet nuget remove source <SOURCE_NAME>
# 示例：删除 cnb-nuget-repo 源的凭据
# dotnet nuget remove source cnb-nuget-repo
```

##### 4. 凭据存储位置

| 客户端/工具      |                                                             |
|:-----------------|:------------------------------------------------------------|
| Windows          | %AppData%\NuGet\NuGet.Config                                |
| Linux/macOS      | ~/.config/NuGet/NuGet.Config or ~/.nuget/NuGet/NuGet.Config |

#### nuget.exe

##### 1. 配置用户名/密码凭据

替换 `<YOUR_TOKEN>` 为访问令牌，`<SOURCE_NAME>` 为自定义源名称，`<REPO_URL>` 为制品库地址：

```bash
nuget sources add -source <REPO_URL> -name <SOURCE_NAME> -username cnb -password <YOUR_TOKEN> -StorePasswordInClearText
# 示例：添加凭据 cnb-nuget-repo
# nuget sources add -source https://nuget.cnbprod.alpha.qq.com/cnb/nuget-repo/-/packages/v3/index.json \
#   -name cnb-nuget-repo -username cnb -password <YOUR_TOKEN> -StorePasswordInClearText
```

##### 2. 凭据配置 API Key

替换 `<YOUR_TOKEN>` 为访问令牌，`<REPO_URL>` 为制品库地址：

```bash
nuget setapikey <YOUR_TOKEN> -source <REPO_URL>
# 示例：凭据添加 API Key
# nuget setapikey <YOUR_TOKEN> -source https://nuget.cnbprod.alpha.qq.com/cnb/nuget-repo/-/packages/v3/index.json
```

##### 3. 查看所有凭据

```bash
nuget sources
```

##### 4. 删除凭据

替换 `<SOURCE_NAME>` 为自定义源名称：

```bash
nuget sources remove -name <SOURCE_NAME>
# 示例：删除 cnb-nuget-repo 源的凭据
# nuget sources remove -name cnb-nuget-repo
```

##### 5. 凭据存储位置

| 客户端/工具      |                                                             |
|:-----------------|:------------------------------------------------------------|
| Windows          | %AppData%\NuGet\NuGet.Config                                |
| Linux/macOS      | ~/.config/NuGet/NuGet.Config or ~/.nuget/NuGet/NuGet.Config |

### 制品管理命令

执行制品管理命令前，需先配置制品库凭据。

#### dotnet CLI

##### 1. 拉取制品

替换 `<PACKAGE_NAME>` 为包名，`<VERSION>` 为版本号，`<SOURCE_NAME>` 为自定义源名称：

```bash
dotnet add package <PACKAGE_NAME> --version <VERSION> --source <SOURCE_NAME>
# 示例：从 cnb-nuget-repo 对应的制品仓库拉取 mynupkg 包的 1.0.0 版本
# dotnet add package test --version 1.0.0 --source cnb-nuget-repo
```

##### 2. 构建制品

替换 `<CSPROJ_PATH>` 为 .csproj 文件路径，`<PKG_PATH>` 为 nupkg 包输出路径，`<VERSION>` 为版本号：

```bash
dotnet pack <CSPROJ_PATH> -p:PackageVersion=<VERSION>  --configuration Release --output <PKG_PATH>
# 示例：构建制品
# dotnet pack mynupkg.csproj --configuration Release --output nupkgs
# 或构建指定版本制品
# dotnet pack mynupkg.csproj -p:PackageVersion=1.0.0 --configuration Release --output nupkgs
```

##### 3. 推送制品

替换 `<NUPKG_PATH>` 为 nupkg 包路径，`<SOURCE_NAME>` 为自定义源名称，`<YOUR_TOKEN>` 为访问令牌：

```bash
dotnet nuget push <NUPKG_PATH> --source <SOURCE_NAME> -k <YOUR_TOKEN>
# 示例：推送 mynupkg 包的 1.0.0 版本
# dotnet nuget push ./mynupkg.1.0.0.nupkg --source cnb-nuget-repo -k <YOUR_TOKEN>
```

##### 4. 删除制品

替换 `<PACKAGE_NAME>` 为包名，`<VERSION>` 为版本号，`<SOURCE_NAME>` 为自定义源名称：

```bash
dotnet nuget delete <PACKAGE_NAME> <VERSION> --source <SOURCE_NAME>
# 示例：删除 cnb-nuget-repo 源 mynupkg 包的 1.0.0 版本
# dotnet nuget delete mynupkg 1.0.0 --source cnb-nuget-repo
```

##### 5. 查询包信息

替换 `<PACKAGE_NAME>` 为包名，`<SOURCE_NAME>` 为自定义源名称：

```bash
dotnet package search <PACKAGE_NAME> --source <SOURCE_NAME>
# 示例：从凭据名为 cnb-nuget-repo 对应的制品仓库查询包名包含 mynuget 的包
# dotnet package search mynuget --source cnb-nuget-repo
```

##### 6. 清除本地 HTTP 请求缓存

```bash
dotnet nuget locals http-cache --clear
```

##### 7. 清除本地所有缓存

```bash
dotnet nuget locals all --clear
```

#### nuget.exe

##### 1. 拉取制品

替换 `<PACKAGE_NAME>` 为包名，`<VERSION>` 为版本号，`<SOURCE_NAME>` 为自定义源名称：

```bash
nuget install <PACKAGE_NAME> -version <VERSION> -source <SOURCE_NAME>
# 示例：从凭据名为 cnb-nuget-repo 对应的制品仓库拉取 mynupkg 包的 1.0.0 版本
# nuget install mynupkg -version 1.0.0 -source cnb-nuget-repo
```

##### 2. 构建制品

替换 `<CSPROJ_PATH>` 为 .csproj 文件路径，`<PKG_PATH>` 为 nupkg 包输出路径：

```bash
nuget pack <CSPROJ_PATH> -Version <VERSION>  -Properties Configuration=Release
# 示例：构建制品
# nuget pack mynupkg.csproj -Properties Configuration=Release
# 或构建指定版本制品
# nuget pack mynupkg.csproj -Version 1.0.0 -Properties Configuration=Release
```

##### 3. 推送制品

替换 `<NUPKG_PATH>` 为 nupkg 包路径，`<SOURCE_NAME>` 为自定义源名称：

```bash
nuget push <NUPKG_PATH> -source <SOURCE_NAME>
# 示例：推送 mynupkg 包的 1.0.0 版本到凭据名为 cnb-nuget-repo 对应的制品仓库
# nuget push ./mynupkg.1.0.0.nupkg -source cnb-nuget-repo
```

##### 4. 删除制品

替换 `<PACKAGE_NAME>` 为包名，`<VERSION>` 为版本号，`<SOURCE_NAME>` 为自定义源名称：

```bash
nuget delete <PACKAGE_NAME> <VERSION> -source <SOURCE_NAME>
# 示例：从凭据名为 cnb-nuget-repo 对应的制品仓库删除 mynupkg 包的 1.0.0 版本
# nuget delete mynupkg 1.0.0 -source cnb-nuget-repo
```

##### 5. 查询包信息

替换 `<PACKAGE_NAME>` 为包名，`<SOURCE_NAME>` 为自定义源名称：

```bash
nuget search <PACKAGE_NAME> -source <SOURCE_NAME>
# 示例：从凭据名为 cnb-nuget-repo 对应的制品仓库查询包名包含 mynuget 的包
# nuget search mynuget -source cnb-nuget-repo
```

##### 6. 清除本地 HTTP 请求缓存

```bash
nuget locals http-cache -clear
```

##### 7. 清除本地所有缓存

```bash
nuget locals all -clear
```

## 云原生构建与开发中使用

### CI 自动构建推送

```yaml title=".cnb.yml"
main:
  push:
    - docker:
        image: mcr.microsoft.com/dotnet/sdk:9.0
      stages:
        - name: add nuget source
          script: |
            dotnet nuget add source \
              https://nuget.cnbprod.alpha.qq.com/cnb/nuget-repo/-/packages/v3/index.json \
              --name cnb-nuget-repo \
              --username ${CNB_TOKEN_USER_NAME} \
              --password ${CNB_TOKEN} \
              --store-password-in-clear-text
        - name: pack
          script: dotnet pack mynupkg.csproj --configuration Release --output nupkgs
        - name: push
          script: dotnet nuget push nupkgs/*.nupkg --source cnb-nuget-repo -k ${CNB_TOKEN}
```

### 云原生开发中推送

在 `.cnb.yml` 中添加 dotnet 开发环境配置，进入后手动执行命令：

```yaml title=".cnb.yml"
$:
  vscode:
    - docker:
        image: mcr.microsoft.com/dotnet/sdk:9.0
```

进入终端后执行：

```shell
dotnet nuget add source \
  https://nuget.cnbprod.alpha.qq.com/cnb/nuget-repo/-/packages/v3/index.json \
  --name cnb-nuget-repo --username cnb --password ${CNB_TOKEN} \
  --store-password-in-clear-text
dotnet pack mynupkg.csproj --configuration Release --output nupkgs
dotnet nuget push "nupkgs/*.nupkg" --source cnb-nuget-repo -k ${CNB_TOKEN}
```

## FAQ 常见问题

### Q1：遇到 401 Forbidden 错误

**可能原因：**

凭据缺少权限

**解决方案：**

重新配置有操作权限的制品库访问令牌。Token 获取：个人设置 → 访问令牌 →
[添加访问令牌](https://cnbprod.alpha.qq.com/profile/token) → 授权范围选择对应的制品库操作权限

### Q2：遇到 403 Forbidden 错误

**可能原因：**

凭据配置错误

**解决方案：**

配置正确的制品库访问令牌。Token 获取：个人设置 → 访问令牌 →
[添加访问令牌](https://cnbprod.alpha.qq.com/profile/token) → 授权范围选择对应的制品库操作权限

### Q3：遇到 409 Forbidden 错误

**可能原因：**

包已存在且不允许覆盖

**解决方案：**

如需覆盖包，请进入对应制品仓库 → 制品库设置 → 策略管理 → 选择允许覆盖已有版本

### Q4：如何支持 HTTP

**可能原因：**

客户端默认只支持 HTTPS

**解决方案：**

| 客户端/工具     | HTTP 支持                                           |
|:----------------|:----------------------------------------------------|
| dotnet CLI      | 添加制品库凭据时指定 `--allow-insecure-connections` |
| nuget.exe       | 添加制品库凭据时指定 `-AllowInsecureConnections`    |

## 更多用法

更多 NuGet 用法，查阅 [NuGet 官方文档](https://learn.microsoft.com/zh-cn/nuget/)。
