部署 packagist私服 搭配gitlab 私服使用

源码地址:composer/packagist
笔者在写这篇文章的时候对应的 commit sha :aa0d63fd6ebbfd991aa3ab652d33c6c8e463543a

因为 packagist 没有版本的概念 所以使用 commit sha 的方式来记录一下

环境安装#

由于最新版使用的是 php8.0, 所以来安装一下 8.0

使用 apt 安装 php8.0

sudo apt install php8.0 php8.0-bcmath php8.0-redis php8.0-cli  php8.0-zip  php8.0-mysql  php8.0-http php8.0-curl  php8.0-common php8.0-raphf  php8.0-dev  php8.0-mbstring php8.0-dom php8.0-xml

安装过程比较简单,基本如上

在安装完成后,composer install 时出现 unrecognised compile-time option bit(s)
按照这个 issure 只用执行以下命令即可(如果你没有出现任何问题,无视即可)
sudo apt-get install --only-upgrade libpcre2-16-0 libpcre2-32-0 libpcre2-8-0 libpcre2-dev libpcre2-posix2

项目部署#

git clone https://github.com/composer/packagist.git && cd packagist

项目配置#

拉取代码之后,先配置一下 redis,database 等等
打开.env 文件

# 数据库配置, 修改成自己的配置,并确保拥有packagist库
DATABASE_URL="mysql://root:123456@127.0.0.1:3306/packagist?serverVersion=8.0"

# ALGOLIA 配置,搜索用。 可前往 https://www.algolia.com/ 注册,免费使用,如果只是尝试本地部署,可忽略
ALGOLIA_APP_ID=xxx
ALGOLIA_ADMIN_KEY=xxx
ALGOLIA_SEARCH_KEY=xxx
ALGOLIA_INDEX_NAME=xxx

# redis 配置,可换成自己
REDIS_URL=redis://localhost

# 谷歌的一个验证,我在使用时,这里会有点问题,下面会讲。
###> beelab/recaptcha2-bundle ###
APP_RECAPTCHA_ENABLED=false
APP_RECAPTCHA_SITE_KEY=needed
APP_RECAPTCHA_SECRET=needed
###< beelab/recaptcha2-bundle ###

apcu 缓存错误#

config/packages/cache.yaml 文件里的 system, 使用的 apcu, 由于我的 php 没有装这个扩展导致缓存报错

framework:
    cache:
        app: cache.adapter.redis
        # 下面的这个system缓存 使用的是apcu。如果你没有安装apcu这个php扩展,可以替换成其他的
        # 例如:cache.adapter.redis  cache.adapter.filesystem 等等
        system: cache.adapter.apcu
        default_redis_provider: snc_redis.cache
        pools:
            doctrine.cache: null
        prefix_seed: packagist

recaptcha2 的问题#

查阅以下代码。
templates/registration/register.html.twig
templates/reset_password/request.html.twig

我们会发现这个设置了一个 set requiresRecaptcha = true,这个会让我们上面.env 中所设置的 APP_RECAPTCHA_ENABLED=false 无效。

这样就会导致如果你没有设置 APP_RECAPTCHA_SITE_KEYAPP_RECAPTCHA_SECRET,那么你就将永远无法提交注册表单,和重置密码的表单。

这个问题困扰了我很久,具体表现为,点击注册按钮,没有任何反应,只有 console 控制台报了一下 recaptcha.js 的错误。

如果你跟我一样,并没有设置 recaptcha, 那么你需要删除上面两个代码文件中的 {% set requiresRecaptcha = true %}
并且再次重新 composer install,或者手动运行 php bin/console cache:clear

当你都已经准备好了之后,就可以使用 composer install 来安装你的程序了。

然后使用 symfony serve 启动一个简单的 webserver

如果你没有 symfony, 请到这里下载一个 symfony.com/download

提交自己的包#

一旦你成功完成以上操作,成功注册了一个账号之后,你可以尝试提交自己的私有包。

例如 https://github.com/xxx/xxxhttps://gitlab.com/xxx/xxx
但,需要记住的是: 这个链接对应的代码库应该是一个 pulic 公开的库,否则你需要到你部署 packagist 项目的机器上设置 ssh 或者 设置 git clone https 时的账号密码

而且你的代码库中,应该拥有 composer.json 文件,并且正确的配置 composer.json 内容。

一旦提交成功,你可以点击 update 按钮更新你的私有包,记住要在服务器上运行 php bin/console packagist:run-workers
当然 最后的做法是按照文档上的,在服务器上使用 crontab 运行上面的命令。

使用自己的包#

一旦上面的都完成了,那么你就已经成功的提交了一个包到自己私有的 packagist 上了
在另一个项目中的 composer.json 中加上 自己的仓库

    "repositories": [
        {
            "type" : "composer",
            "url" : "https://packagist.mydomain.com"
        }
    ]

然后 composer require my/packagist,你就可以成功的下载

配置私有的 gitlab-domains#

正常来说,我们的包应该拥有一个版本号,并且可以下载 dist
但如果我们使用私有的 gitlab, 每次 composer install 或者 composer require 时 是使用 git clone 的方式去拉取源码。

你可以使用 composer require xxx/xxx -vvv 的方式来查看 composer 下载每个包的细节

这样就会对你 composer install 时的环境有要求,必须拥有 git 命令。
在一些 k8s,docker 镜像中 install 时可能会出现一些些问题。
我们在 packagist 部署的机器上运行下面的这个命令,再次去 packagist 中更新自己的包
然后再 rm -rf vendor && rm -rf composer.lock && composer install -vvv 你就可以看到以 dist 的方式去 gitlab 下载源码了,不再是 git clone 的方式去克隆源码

 composer --global config gitlab-domains gitlab.xxx.cn gitlab.com
本作品采用《CC 协议》,转载必须注明作者和本文链接
marun