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

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

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

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

## 推送制品

::: tabs
@tab 本地命令行推送

1.配置 .netrc 以在使用 curl 命令时自动加载推送凭据. `<CNB_TOKEN>` 请替换成实际值

```shell
printf "\nmachine \nlogin cnb\npassword %s\n" "<CNB_TOKEN>" >> ~/.netrc
```

2.执行以下命令推送到 CNB. `<REPO_URL>`, `<PACKAGE>`, `<VERSION>`, `<LOCAL_FILE_NAME>` 请替换成实际值

```shell
curl --netrc '<REPO_URL>/<PACKAGE>?version=<VERSION>' -T '<LOCAL_FILE_NAME>'
```

@tab 云原生构建中推送

1.粘贴以下内容到 `.cnb.yaml`, 提交到代码仓库. `<REPO_URL>`, `<PACKAGE>`, `<LOCAL_FILE_NAME>` 请替换成实际值

```yaml title=".cnb.yml"
$:
  tag_push:
    - docker:
        image: curlimages/curl
      stages:
       - name: "配置认证凭据"
         script: printf "machine \nlogin cnb\npassword %s\n" "${CNB_TOKEN}" > ~/.netrc
       - name: "发布到 CNB"
         script: curl --netrc "<REPO_URL>/<PACKAGE>?version=${CNB_BRANCH}" -T "<LOCAL_FILE_NAME>"
```

2.提交一个 Tag, 将会触发云原生构建, 注意: Tag 值将会作为制品版本号, 请使用[语义版本号](https://semver.org/lang/zh-CN/)

@tab 云原生开发中推送

1.点击代码仓库页面右上角 **「云原生开发」** 按钮进入开发环境

2.执行以下命令配置凭据

```shell
printf "machine \nlogin cnb\npassword %s\n" "${CNB_TOKEN}" > ~/.netrc
```

3.发布到 CNB. `<REPO_URL>`, `<PACKAGE>`, `<VERSION>`, `<LOCAL_FILE_NAME>` 请替换成实际值

```shell
curl --netrc '<REPO_URL>/<PACKAGE>?version=<VERSION>' -T '<LOCAL_FILE_NAME>'
```

:::

## 使用制品

### 拉取制品

1.配置 .netrc 以在使用 curl 命令时自动加载推送凭据. `<CNB_TOKEN>` 请替换成实际值

```shell
printf "\nmachine \nlogin cnb\npassword %s\n" "<CNB_TOKEN>" >> ~/.netrc
```

2.拉取制品. `<REPO_URL>`, `<PACKAGE>`, `<VERSION>` 请替换成实际值

```shell
curl -OfL --netrc '<REPO_URL>/<PACKAGE>?version=<VERSION>'
```

### 删除制品

generic 暂时没有提供删除命令, 请参考 [删除制品](/zh/artifact/intro.md#删除制品)

## FQA

### Q1: 包名限制规则

> 包名指完整路径, 例如: a/b/c.txt

1. 最长为 128, 层级深度最大为 5
2. 区分大小写. a/b/c.txt 和 A/B/C.TXT 是不同路径
3. 目录和文件不能同名. 不允许 a/b/c 和 a/b/c/ 同时存在
4. 路径片段不能以空格开头或结尾. a/ b /c.txt 会在参数校验时抛错
5. 单独 - 不能作为目录名或文件名. a/-/c.txt 是不合法的
6. 包名字符的白名单正则为: `"^[a-zA-Z0-9\u4e00-\u9fa5._\\-/ ]+$"`
