---
url: /zh/artifact/nuget.md
---
## 前置准备

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 的访问令牌作为登录凭据，配置命令：

::: tabs
@tab dotnet CLI

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

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

```yaml
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.cnb.share.ralphlauren.cn/cnb/nuget-repo/-/packages/v3/index.json --name cnb-nuget-repo --username cnb --password <YOUR_TOKEN> --store-password-in-clear-text

```

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

```yaml
dotnet nuget list source
```

#### 3. 删除凭据

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

```yaml
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 |

@tab nuget.exe

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

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

```yaml
nuget sources add -source <REPO_URL> -name <SOURCE_NAME> -username cnb -password <YOUR_TOKEN> -StorePasswordInClearText
# 示例: 添加凭据cnb-nuget-repo
# nuget sources add -source https://nuget.cnb.share.ralphlauren.cn/cnb/nuget-repo/-/packages/v3/index.json -name cnb-nuget-repo -username cnb -password <YOUR_TOKEN> -StorePasswordInClearText
```

#### 2. 凭据配置api-key

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

```yaml
nuget setapikey <YOUR_TOKEN> -source <REPO_URL>
# 示例: 凭据添加 apikey
# nuget setapikey <YOUR_TOKEN> -source https://nuget.cnb.share.ralphlauren.cn/cnb/nuget-repo/-/packages/v3/index.json
```

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

```yaml
nuget sources
```

#### 4. 删除凭据

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

```yaml
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 |

:::

### 制品管理命令

执行制品管理命令前请先配置好制品库凭据
::: tabs
@tab dotnet CLI

#### 1. 拉取制品

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

```yaml
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>` 为版本号

```yaml
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>` 为访问令牌

```yaml
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>` 为自定义源名称

```yaml
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>` 为自定义源名称

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

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

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

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

```yaml
dotnet nuget locals all --clear
```

@tab nuget.exe

#### 1. 拉取制品

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

```yaml
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 包输出路径

```yaml
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>` 为自定义源名称

```yaml
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>` 为自定义源名称

```yaml
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>` 为自定义源名称

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

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

```yaml
nuget locals http-cache -clear
```

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

```yaml
nuget locals all -clear
```

:::

## 云原生构建中使用

流水中构建nupkg包,并推送到制品库

替换 `<REPO_URL>` 为制品库地址，`<SOURCE_NAME>` 为自定义源名称，`<CSPROJ_PATH>` 为 .csproj 文件路径， `<PKG_PATH>` 为 nupkg 包输出路径，`<NUPKG_NAME>` 为 nupkg 包名

```yaml title=".cnb.yml"
main:
  push:
    - docker:
        image: mcr.microsoft.com/dotnet/sdk:9.0
      stages:
        - name: 配置 nuget 仓库的地址、账号、密码
          script: dotnet nuget add source <REPO_URL> --name <SOURCE_NAME> --username ${CNB_TOKEN_USER_NAME} --password ${CNB_TOKEN} --store-password-in-clear-text
        - name: 打包 nuget 制品 
          script: dotnet pack <CSPROJ_PATH> --configuration Release --output <PKG_PATH>  
        - name: 推送 nuget 制品到 CNB
          script: dotnet nuget push <PKG_PATH>/<NUPKG_NAME> --source <SOURCE_NAME> -k ${CNB_TOKEN}
```

* 示例:

```yaml title=".cnb.yml"
main: 
  push: 
    - docker: 
        image: mcr.microsoft.com/dotnet/sdk:9.0 
      stages: 
        - name: 配置 nuget 仓库的地址、账号、密码
          script: dotnet nuget add source https://nuget.cnb.share.ralphlauren.cn/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: 打包 nuget 制品
          script: dotnet pack mynupkg.csproj --configuration Release --output nupkgs 
        - name: 推送 nuget 制品到 CNB 
          script: dotnet nuget push nupkgs/*.nupkg --source cnb-nuget-repo -k ${CNB_TOKEN}
```

## 云原生开发中使用

#### 1. 在.cnb.yml中配置dotnet开发环境

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

#### 2. 配置 nuget 仓库的地址、账号、密码

替换 `<REPO_URL>` 为制品库地址，`<SOURCE_NAME>`为自定义源名称

```yaml
dotnet nuget add source <REPO_URL> --name <SOURCE_NAME> --username cnb --password <YOUR_TOKEN> --store-password-in-clear-text
dotnet pack xxx.csproj --configuration Release --output nupkgs
dotnet nuget push "nupkgs/*.nupkg" --source <SOURCE_NAME> -k ${CNB_TOKEN}
```

* 示例: 打包 nuget 制品并推送 nuget 制品到 CNB

```shell
dotnet nuget add source https://nuget.cnb.share.ralphlauren.cn/cnb/nuget-repo/-/packages/v3/index.json --name cnb-nuget-repo --username cnb --password <YOUR_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 错误

**可能原因:**&#x20;
凭据缺少权限

**解决方案:**&#x20;
重新配置有操作权限的制品库访问令牌
token获取: 个人设置 -> 访问令牌 -> [添加访问令牌](https://cnb.share.ralphlauren.cn/profile/token) -> 授权范围选择对应的制品库操作权限

### Q2：遇到 403 Forbidden 错误

**可能原因:**&#x20;
凭据配置错误&#x20;

**解决方案:**&#x20;
配置正确的制品库访问令牌
token获取: 个人设置 -> 访问令牌 -> [添加访问令牌](https://cnb.share.ralphlauren.cn/profile/token) -> 授权范围选择对应的制品库操作权限

### Q3：遇到 409 Forbidden 错误

**可能原因:**&#x20;
包已存在且不允许覆盖

**解决方案:**&#x20;
如需覆盖包，请进入对应制品仓库->制品库设置->策略管理->选择允许覆盖已有版本

### Q4：如何支持HTTP

**可能原因:**&#x20;
客户端默认只支持https

**解决方案:**&#x20;

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

## 更多用法

更多 nuget 用法，请查阅官方文档
