satis原理浅析

什么是satis

我们一般是从packagist获取composer包的,但这些都是公开的。那如果我们想创建自己的私有库呢,比如企业就会有这方便的需要,那我们就可以用satis来创建自己的私有库。

Satis 是一个静态的 composer 资源库生成器。它像是一个超轻量级的、基于静态文件的 packagist 版本。
你给它一个包含 composer.json 的存储库,定义好 VCS 和 资源库。它会获取所有你列出的包,并打印 packages.json 文件,作为 composer 类型的资源库。

什么是主资源库

搭建过satis的同学都知道,如果我们要引用它,需要在composer.json中加入对应的仓库

"repositories": {
 "satis": {
 "type": "composer",
 "url" : "http://satis.corp.anjuke.com"
 },
 "aptf": {
 "type":"git",
 "url":"git@gitlab.corp.anjuke.com:maben01/aptf.git"
 }
}

我们可以看到,satis仓库的类型为composer,那类型为composer是啥意思呢?附上官网的解释

主资源库的类型为 composer。它使用一个单一的 packages.json 文件,包含了所有的资源包元数据。
这也是 packagist.org 所使用的资源类型。要引用一个 composer 资源库,只需要提供一个存放 packages.json 文件的 目录路径。比如要引用 packagist.org 下的 /packages.json,它的 URL 就应该是 packagist.org。而 example.org/packages.json 的 URL 应该是 example.org

抓包看究竟

我们使用composer require xxx命令时,composer会依次查找composer.json中的repositories块是否有指定的包。当看到类型为composer的statis地址时,composer实际上是发起了一次http请求,可以看到user-agent为'composer/1.6.2'。

但返回了一串“include/all$e75fd28807530f173c649ebc19728a480208c415.json”是什么意思?我是要获取composer包的元数据啊!关键在于includes,官网给出了解释

对于较大的资源库,可以拆分 packages.json 为多个文件。includes 字段允许你引用这些额外的文件。
文件的 SHA-1 码允许它被缓存,仅在 hash 值改变时重新请求。

composer看到返回的sha-1改变了,会发起第二次请求来获取真正的元数据。抓包如下

可以看到,请求的路径就是上次请求includes块的key值,此时我们终于知道composer包的源地址在哪啦,撒花~

以上是我的个人理解,如有错误,欢迎指正~

    作者:Uchiha_Ponny原文地址:https://segmentfault.com/a/1190000013681740

    %s 个评论

    要回复文章请先登录注册