透過 Composer 安裝 Private Package

前言

Composer 是一個強大的 PHP 套件管理工具,讓你可以方便地使用在 packagist.org 上的開源 PHP 套件。但有時候,團隊可能有一些內部的工具或特殊套件,並且不想讓外界看到。這時候,你就需要自己來管理這些 Private Packages。
除了使用 packagist.com 的付費服務外,如果是預算有限或者有其他考量,則可以考慮自行管理需要的 Private Packages。

以下內容會整理出如何使用 Composer 安裝自己的 Private Package。

可以使用的 Composer Repository Types

Composer 本身提供的多種 Types 進行 package 的管理,這裡先以 VCS 與 Path 為主簡單紀錄

使用 VCS

Local Git Repository

在本地建立 package 的 Git Repository
專案與 packages 的資料夾結構如下:

Directory

1
2
3
4
5
6
├── apps
│ └── my-app
│ └── composer.json
├── packages
│ └── my-package
│ └── composer.json

apps/my-app/composer.json

1
2
3
4
5
6
7
8
{
"repositories": [
{
"type": "vcs",
"url": "../../packages/my-package"
}
]
}

GitHub Repository

假設目前已經把 Package 做好並放在 GitHub 的 Private Repository 裡。
接下來,我們要讓 Composer 有權限去存取這個 Private Repository,這裡使用最常用的 SSH 的方式,讓 Composer 能夠連接到我們在 GitHub 上的 Private Repository

  • 準備 Github 專用的 SSH Key

    1
    cd ~/.ssh/ && ssh-keygen -t rsa -b 4096 -C "your-email@example.com"

    並將檔案名稱設定為 github_ssh

  • 修改 ~/.ssh/config

    1
    2
    3
    4
    Host *
    Hostname github.com
    User git
    IdentityFile ~/.ssh/github_ssh

apps/my-app/composer.json

1
2
3
4
5
6
"repositories": [
{
"type": "vcs",
"url": "git@github.com:your-github-username/your-repository-name.git"
}
]

使用 Path

在本地建立 Package 的 Git Repository
專案與 Packages 的資料夾結構如下:

Directory

1
2
3
4
5
6
├── apps
│ └── my-app
│ └── composer.json
├── packages
│ └── my-package
│ └── composer.json

apps/my-app/composer.json

1
2
3
4
5
6
7
8
9
10
11
{
"repositories": [
{
"type": "path",
"url": "../../packages/my-package",
"options": {
"symlink": false
}
}
]
}
  • symlink
    • 啟用時,會跟目標路徑的內容做同步,會即時反應修改
    • 關閉時,會複製一份獨立的內容,如果有修改則需要再重新安裝一次
  • 透過 path 的方式會直接抓取最新檔案,不會參考 composer.json 裡面的版本限制

安裝 my-package

會參考 my-package 的 composer.json 裡面的 name,以 packages/my-package 為例
需要以 dev-* 的方式指定版本

1
2
3
4
composer require packages/my-package:dev-main

# 指定 branch
composer require packages/my-packages:dev-branch

備註

  • 注意 my-package 的 main branch 裡 composer.json 的 package name,抓取的時候會優先以 main 為主,如果 main branch 與 feature branch 不同的話可能會找不到 Repository,開發時可以多利用 composer require -v packages/my-package 的方式了解操作的紀錄
  • 如果有調整 composer.json 的話,記得執行 composer clearcache 清除資料

參考

https://dudi.dev/composer-private-packages-github-repository
https://getcomposer.org/doc/03-cli.md
https://getcomposer.org/doc/05-repositories.md
https://packagist.com/
https://stackoverflow.com/questions/40619393/how-to-add-private-github-repository-as-composer-dependency