---
url: /zh/artifact/composer.md
---
## 推送凭据配置

通过 cnb REST API 上传制品文件到 composer 制品库。如何获取 `CNB_TOKEN` 请参考[创建访问令牌](./intro.md#创建访问令牌)

### 配置 .netrc 以在使用 curl 命令时自动加载推送凭据

```shell
echo -e "\nmachine composer.cnb.build\nlogin cnb\npassword <CNB_TOKEN>" >> ~/.netrc
```

### 或者直接在 curl 命令中显示指定推送凭据

```shell
curl -ucnb:<CNB_TOKEN> https://composer.cnb.build/xxx... -T <PATH_TO_FILE>
```

## 拉取凭据配置

1.添加制品库地址到全局 config.json (通常位于 ~/.composer/config.json)。如何获取 `CNB_COMPOSER_URL` 请参考[获取制品库地址](./intro.md#获取制品库的地址)

```shell
# 关闭默认官方源
composer config repos.packgist false -g
# 使用 cnb 源
# 示例: composer config repos.cnb-composer-repo composer https://composer.cnb.build/cnb/composer-repo/-/packages/ -g
composer config repos.cnb composer <CNB_COMPOSER_URL> -g
```

2.添加凭据到全局 auth.json (通常位于 ~/.composer/auth.json)

```shell
composer config http-basic.composer.cnb.build cnb <CNB_TOKEN> -g
```

## 推送制品

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

1.粘贴以下内容到 composer.json, 避免打包认证信息和依赖

```json
{
    "archive": {
        "exclude": ["auth.json", "composer.lock", "vendor"]
    }
}
```

2.进入包目录, 打包 Composer 制品

```shell
composer archive -f zip --file package
```

3.发布到 CNB

**注意:**

1. 如何获取 `CNB_COMPOSER_URL` 请参考[获取制品库地址](./intro.md#获取制品库的地址)
2. `<vendor>/<package>/<version>` 需替换成当前包的对应值, 例如 `monolog/monolog/3.8.1`

```shell
curl --netrc "<CNB_COMPOSER_URL>upload/<vendor>/<package>/<version>" -T package.zip
```

@tab 云原生构建中推送

1.粘贴以下内容到 `.cnb.yaml`

**注意:**

1. `CNB_COMPOSER_URL`需要被替换，如何获取请参考[获取制品库地址](./intro.md#获取制品库的地址)
2. `<vendor>/<package>` 需替换成当前包的对应值, 例如 `monolog/monolog`

```yaml
$:
  tag_push:
    - docker:
        image: docker.cnb.cool/examples/language/php-8.4
      stages:
        - name: 配置认证凭据
          script: echo -e "machine composer.cnb.build\nlogin cnb\npassword ${CNB_TOKEN}" > ~/.netrc
        - name: 打包 Composer 制品
          script: composer archive -f zip --file package
        - name: 发布到 CNB
          script: curl --netrc -T package.zip "<CNB_COMPOSER_URL>upload/<vendor>/<package>/${CNB_BRANCH}"
```

2.粘贴以下内容到 composer.json, 避免打包认证信息和依赖

```json
{
    "archive": {
        "exclude": ["auth.json", "composer.lock", "vendor"]
    }
}
```

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

@tab 云原生开发中推送

1.粘贴以下内容到 composer.json, 避免打包认证信息和依赖

```json
{
    "archive": {
        "exclude": ["auth.json", "composer.lock", "vendor"]
    }
}
```

2.粘贴以下内容到 `.cnb.yaml`, 提交到代码仓库后, 点击代码仓库页面右上角 **「云原生开发」** 按钮进入开发环境

```yaml
$:
  vscode:
    - docker:
        image: docker.cnb.cool/examples/language/php-8.4
      services:
        - vscode
        - docker
```

3.进入开发环境后, 在命令行执行以下命令, 配置认证凭据

```shell
echo -e "machine composer.cnb.build\nlogin cnb\npassword ${CNB_TOKEN}" > ~/.netrc
```

4.打包 Composer 制品

```shell
composer archive -f zip --file package
```

5.发布到 CNB

**注意:**

1. 如何获取 `CNB_COMPOSER_URL` 请参考[获取制品库地址](./intro.md#获取制品库的地址)
2. `<vendor>/<package>/<version>` 需替换成当前包的对应值, 例如 `monolog/monolog/3.8.1`

```shell
curl --netrc -T package.zip "<CNB_COMPOSER_URL>upload/<vendor>/<package>/<version>"
```

:::

## 使用制品

### 拉取制品

按照上文中[拉取凭据配置](#la-qu-ping-ju-pei-zhi) 配置凭证后, 使用以下命令拉取制品

```shell
# 以 monolog/monolog 举例
composer require monolog/monolog
```

### 删除制品

composer 没有提供删除命令, 请参考[删除制品](./intro.md#删除制品)

## FQA

### Q1: 上传制品抛错没有权限

**示例:**

```shell
curl --netrc <CNB_COMPOSER_URL>upload/monolog/monolog/3.8.0 -T monolog.zip
{"errcode":16,"errmsg":"not authorized"}
```

**解决方案:**

参考[创建令牌](./intro.md#创建访问令牌) 和 [推送凭据配置](#tui-song-ping-ju-pei-zhi) 正确配置凭据

### Q2: 上传制品抛错版本号格式不对

**示例:**

```shell
curl --netrc <CNB_COMPOSER_URL>upload/monolog/monolog/xxx3.8.0 -T monolog.zip
{"errcode":3,"errmsg":"validate [Version:xxx3.8.0] failed"}
```

**解决方案:**

请使用 [语义版本号](https://semver.org/lang/zh-CN/)

### Q3: 关于 composer 1.x

官方源在 2025 年 8 月 1 日, 已停止对 composer 1.x 的支持

cnb composer 制品库也推荐使用 composer 2.x 及以上版本的命令行

若您使用的是 composer 1.x 版本, 可通过 `composer self-update` 命令更新为 composer 2.x 的最新稳定版本.
