如何利用 Composer 引入私有包
Composer 是 PHP5.3 以上的引入的一个依赖管理工具。 它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们。 Composer 不是一个包管理器。 是的,它涉及”packages” 和”libraries”,但它在每个项目的基础上进行管理,在你项目的某个目录中(例如vendor)进行安装。
Composer 极大的方便了我们的开发,避免了很多重复造轮子的操作,也在一定程度上降低了我们项目中代码的复杂度,提高了我们的开发效率。目前 Composer 的数据源都来自 packagist ,但是这些都必须是开源的,在公司内部总会有一些私有的代码是不能公开的,这时候我们就需要搭建一个公司内部使用的 composer 仓库,或者通过令牌的形式获取私有的拓展包,接下来主要介绍在项目中引入私有拓展包的三种方式。
方式一:使用 github 访问令牌 授权
1. 创建 composer 私有包,私有包至少要保证有一个 pre-releases,否则安装会失败
2. 授权 composer 访问 github 私有仓库
注意这一部分必须勾选,否则拉取不到仓库资料(其余的就不需要勾选了)
- 如果是公有仓库的话,就不需要勾选
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
成功之后的结果如下:
方式二:使用 ssh 密钥授权
1. 登录服务器/或者你自己的开发机生成 ssh 密钥
# 如果存在则不需要重新创建,当然你也可以生成多个 ssh 密钥,来针对不同的环境
$ cd ~/.ssh/ && ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
让你指定密钥名字的时候可以重命名一下,默认是 id_rsa。
⚠️:这里有一点需要注意的是,必须保证邮箱地址与 github 的一致,否则拉取会失败。
2. 将生成的 ssh 密钥写入到 github ssh keys 中
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. 验证是否连接成功
4. 利用 composer require 引入
$ composer require liuhao/private-page
⚠️这个方式我没有操作成功过,一直提示让我输入 token,但是貌似确实是有这个方案。
方式三:通过 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 的效果:
5. 在项目的 composer.json 中增加如下配置:
"repositories": [
{ "type": "composer", "url": "http://satis.test" }
],
6. 开始引入包
$ composer require liuhao/private-page
不出意外的话,应该会看到如下错误:
Composer 的配置不允许 http 访问。
解决方案:
$ composer config secure-http false
接下来的话就可以看到成功的效果啦:
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 协议》,转载必须注明作者和本文链接
推荐文章: