這裡記錄如何建立 Laravel 可使用的 packages,以及如何透過私人 git repositroy 來透過 composer 安裝。

首先,建立 Laravel Project 來做示範:

composer create-project --prefer-dist laravel/laravel getter

建立 package 相關資料夾

packages/{vender_name}/{package_name}/src/

例如:

mkdir -p packages/simplexi/greetr/src

前往 package_name file

cd packages/simplexi/greetr/

執行 composer 初始化,以下資訊可以先填寫,或者後續填寫

composer init
Package name (<vendor>/<name>) [adamouyang/greetr]: adamsimplexi/greetr
Description []: A Simple Laravel Package
Author [, n to skip]: Adam OuYang <adamouyang@test.test>
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []: MIT

建立好 package 的 composer.json 後,調整資訊

(composer schema 可以參考這裡 https://getcomposer.org/doc/04-schema.md)

{
    "name": "adamsimplexi/greetr",
    "description": "A Simple Laravel Package",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Adam OuYang",
            "email": "adamouyang@test.test"
        }
    ],
    "minimum-stability": "dev",
    "autoload":{
      "psr-4": {
            "Adamsimplexi\\Greetr\\": "src/"
        }
    },
    "require": {}
}

上面設定,表示可以透過 namespace : Adamsimplexi/Greetr

接著,回到專案 root 位置的 composer.json (注意,這裡是專案,而不是 packages 的 composer.json)

CVT2HUGO: 來 autoload 你的package
"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Adamsimplexi\\Greetr\\": "packages/simplexi/greetr/src"
    },
    "classmap": [
        "database/seeds",
        "database/factories"
    ]
},

接著再專案 root 位置執行

composer dump-autoload

接著建立一個檔案

vim packages/simplexi/greetr/src/Greetr.php

內容

<?php

namespace Adamsimplexi\Greetr;

class Greetr
{
    public function greet(String $sName)
    {
        return 'Hi ' . $sName . '! How are you doing today?';
    }
}

接著在 route 使用這個 package

vim routes/web.php

內容

use Adamsimplexi\Greetr\Greetr;

Route::get('/greet/{name}', function($sName) {
    $oGreetr = new Greetr();
    return $oGreetr->greet($sName);
});

啟用 server 並且查看是否成功引入 package

php artisan serve

前往網址

http://127.0.0.1:8000/greet/test

發布 packages 到 github

前往 packages/simplexi/greetr

CVT2HUGO: 初始化 git
git init
git checkout -b master
git add .
git commit -m "initial commit"
git tag 1.0.0

在 github 建立 repository,以及將本地的檔案,包含 tags 推上去 tags 將會作為 composer packages 安裝的版本依據

git remote add origin git@github.com:adon988/greetr.git
git push -u origin --all
git push -u origin --tags

接著,調整 root 位置的 composer.json 這裡引用repositorys 的 type 設定方式

  • vps : 如果只有安裝單一 repository
  • composer : 如果需要在同一個 gitlab domain 下,安裝多個 repository 時
...
"require": {
    "php": "^7.1.3",
    "fideloper/proxy": "^4.0",
    "laravel/framework": "5.7.*",
    "laravel/tinker": "^1.0",
		"adamsimplexi/greetr": "^1.0.0"
},
...
"repositories": [
    {
        "type": "git",
            "url": "git@github.com:adon988/greetr.git"
    }
]
...

最後,執行更新

//composer clear-cache
composer update

參考: https://medium.com/cafe24-ph-blog/build-your-own-laravel-package-in-10-minutes-using-composer-867e8ef875dd https://laravel.com https://getcomposer.org/doc/04-schema.md https://medium.com/teknomuslim/how-to-build-your-own-laravel-package-chapter-1-9ffc0da9c04d https://pineco.de/laravel-package-development-basics/