如何利用 Composer 引入私有包

Composer 是 PHP5.3 以上的引入的一个依赖管理工具。 它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们。 Composer 不是一个包管理器。 是的,它涉及”packages” 和”libraries”,但它在每个项目的基础上进行管理,在你项目的某个目录中(例如vendor)进行安装。

Composer 极大的方便了我们的开发,避免了很多重复造轮子的操作,也在一定程度上降低了我们项目中代码的复杂度,提高了我们的开发效率。目前 Composer 的数据源都来自 packagist ,但是这些都必须是开源的,在公司内部总会有一些私有的代码是不能公开的,这时候我们就需要搭建一个公司内部使用的 composer 仓库,或者通过令牌的形式获取私有的拓展包,接下来主要介绍在项目中引入私有拓展包的三种方式。

方式一:使用 github 访问令牌 授权

1. 创建 composer 私有包,私有包至少要保证有一个 pre-releases,否则安装会失败

Laravel

Laravel

2. 授权 composer 访问 github 私有仓库

Laravel

  • 如果是公有仓库的话,就不需要勾选 repo
  • 如果项目安全性比较高的话,访问令牌的有效期尽量不要设置为永久

3. 授权

在项目根目录创建 auth.json 文件,Composer 可以使用这个访问令牌连接到我们的私有仓库。如果没有这个文件或者密钥权限不足,在安装的时候,会提示让你重新输入。

⚠️:这个文件不要提交到版本管理中,否则会导致数据泄漏!

{
    "github-oauth": {
        "github.com": "ghp_xxxxxxx"
    }
}

4. 在项目的 composer.json 中增加如下配置:

"repositories": [
  {
      "type": "vcs",
      "url":  "https://github.com/thisliu/test-composer.git"
  }
]

5. 利用 composer require 即可引入

$ composer require liuhao/private-page

成功之后的结果如下:

Laravel

方式二:使用 ssh 密钥授权

1. 登录服务器/或者你自己的开发机生成 ssh 密钥

# 如果存在则不需要重新创建,当然你也可以生成多个 ssh 密钥,来针对不同的环境
$ cd ~/.ssh/ && ssh-keygen -t rsa -b 4096 -C "your-email@example.com"

让你指定密钥名字的时候可以重命名一下,默认是 id_rsa。

Laravel

⚠️:这里有一点需要注意的是,必须保证邮箱地址与 github 的一致,否则拉取会失败。

2. 将生成的 ssh 密钥写入到 github ssh keys

Laravel

3. 在项目的 composer.json 中增加如下配置

"repositories": [
    {
        "type": "vcs",
        "url": "git@github.com:thisliu/test-composer.git"
    }
]

4. 配置 ssh config

# ~/.ssh/config
Host *
    Hostname github.com
    User git
    IdentityFile /Users/liuhao/.ssh/github_ssh

5. 验证是否连接成功

Laravel

Laravel

4. 利用 composer require 引入

$ composer require liuhao/private-page

⚠️这个方式我没有操作成功过,一直提示让我输入 token,但是貌似确实是有这个方案。

Laravel

方式三:通过 satis 处理私有仓库

Satis 是开源的,它只是一个静态的 Composer 储存库生成器。它有点类似于一个超轻量的 packagist , 可以用于托管公司的私有 packages 或者保存自己的私有 packages。

1. 安装

$ composer create-project composer/satis --stability=dev --keep-vcs

2. 更新配置文件

# satis/satis.json

{
  "name": "private-composer",
  "homepage": "http://satis.test",
  "repositories": [
    {
      "type": "vcs",
      "url":  "https://github.com/thisliu/test-composer.git"
    }
  ],
  "require": {
    "liuhao/private-page": "^1.0"
  },
  "archive": {
    "directory": "dist",
    "format": "tar",
    "prefix-url": "http://satis.test"
  }
}
  • name:仓库的名字,可以随便定义
  • homepage:仓库建立之后的的主页地址
  • repositories:指定去哪获取包,url 中需要带 .git
  • require:指定获取哪些包,如果想获取所有包,使用 require-all: true,

3. 打包

# 目录可以自己定义 不一定要叫 public
$ php bin/satis build satis.json public/

⚠️在执行这一个步骤的时候,如果是私有的 github 仓库,那就还是需要重复上面直接通过 github 授权访问私有仓库的步骤。如果说你的环境只需要访问 github 私有仓库的话,就没有必要专门弄一个 satis 环境了。

4. 配置 nginx 环境

server {
    listen 80;
    listen [::]:80;

    server_name satis.test;
    root /var/www/satis/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }

    error_log /var/log/nginx/exinone_error.log;
    access_log /var/log/nginx/exinone_access.log;
}

配置完成之后,访问 satis.test 的效果:

Laravel

5. 在项目的 composer.json 中增加如下配置:

    "repositories": [
        { "type": "composer", "url": "http://satis.test" }
    ],

6. 开始引入包

$ composer require liuhao/private-page

不出意外的话,应该会看到如下错误:

Laravel

Composer 的配置不允许 http 访问。

解决方案:

$ composer config secure-http false

接下来的话就可以看到成功的效果啦:

Laravel

7. 一些小拓展

  • 上面的 satis.json 中的archive 就是相当于提前把包给缓存下来,这样后面项目需要引入的时候,就不会很慢了

    • directory:必需要的,表示生成的压缩包存放的目录,会在我们 build 时的目录中
    • format:压缩包格式,zip(默认) tar
    • prefix-url:下载链接的前缀的 Url, 默认会从 homepage 中取
    • skip-dev:默认为 false,是否跳过开发分支
    • absolute-directory:绝对目录
    • whitelist:白名单,只下载哪些
    • blacklist:黑名单,不下载哪些
    • checksum:可选,是否验证 sha1
  • 只构建部分包:

    $ php bin/satis build satis.json public/ this/package that/other-package
  • 安全性问题:

    如果别人获取到了你的 satis 地址,那他一样可以用来拉去私有的拓展

    解决方案:

    • Ip 白名单的形式,这个 satis 只开放白名单范围内的机器使用

    • 要求通过 SSH/SSL 连接 Satis

      {
        "repositories": [{
          "type": "composer",
          "url": "http://satis.test",
          "options": {
            "ssh2": {
              "username": "composer",
              "pubkey_file": "~/.ssh/id_rsa.pub",
              "privkey_file": "~/.ssh/id_rsa"
            }
          }
        }]
      }
    • 使用客户端证书通过 SSL/TLS(HTTPS)的方式连接的示例

      {
        "repositories": [{
           "type": "composer",
           "url": "http://satis.test",
           "options": {
             "ssl": {
               "local_cert": "~/.ssl/composer.pem"
             }
           }
        }]
      }
    • 使用 自定义的 HTTP header 字段进行身份验证的示例

      {
        "repositories": [{
          "type": "composer",
          "url": "http://satis.test",
          "options":  {
            "http": {
              "header": [
                "API-TOKEN: YOUR-API-TOKEN"
              ]
            }
          }
        }]
      }
    • 更多详细的安全问题请查阅:composer 中文文档

结束语

对比了上面的三种方式,就我们现在的项目而言,第一种方式是最适合我们的,如果采用 satis 的方式的话,还是需要配置 token。不过 satis 的方式是扩展性最强的,不仅仅只支持 github 私有仓库,各种平台的私有仓库都可以部署进去。

有一点需要注意的是,如果采用 satis 方式的话一定要注意安全的配置,还有需要定期刷新缓存下来的包,如果可以的话,可以加一个定时器来处理。

本作品采用《CC 协议》,转载必须注明作者和本文链接
finecho # Lhao
本帖由系统于 9个月前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4
Summer

小豪的文章看起来就是舒服

9个月前 评论
finecho (楼主) 9个月前

可以可以, 豪哥又开始生产了

9个月前 评论

豪哥好长时间没发文了,求更新!!!

4个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!