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

marun發表於2021-11-20

原始碼地址: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 協議》,轉載必須註明作者和本文連結

相關文章