開發並部署 laravel package 到 github 上

注意事項

  • 路徑要符合 PSR-4 規範,autoload 才找得到
  • 使用 git-tag 對 package 版號控管
  • 套件內的 composer.json 的 require 很重要,如果有相依於 laravel 版本的話要注意

資料夾呈現結果如圖

接下來說明步驟


開發

Step1. 建立專案

這裡以 5.5 為例

cd /path/to/your/package-develop-project && composer create-project --prefer-dist laravel/laravel . "5.5.*"

Step2. 建立 package 開發路徑

於 laravel documentroot 建立 packages folder, path如下

packages/{vendor-name}/{package-name}/src

並於 src 層使用composer init填入相關資料,以下是我的範例

{
  "name": "cw/kafkalogger",
  "description": "send log direct into kafka",
  "type": "library",
  "license": "MIT",
  "authors": [
    {
      "name": "whchi",
      "email": "whccchi@gmail.com.tw"
    }
  ],
  "minimum-stability": "dev",
  "require": {
    "php": ">=7.1",
    "laravel/framework": "5.5.*",
    "Psr/Log": "1.0.2",
    "nmred/kafka-php": "v0.2.0.8"
  },
  "autoload": {
    "psr-4": {
      "Cw\\KafkaLogger\\": "src/"
    }
  }
}

要注意的地方是

{
  "require": {
    ...
    "laravel/framework": "5.5.*",
    ...
  },
  ...
  "autoload": {
    "psr-4": {
      "Cw\\KafkaLogger\\": "src/"
    }
  }
}

這兩個地方要填正確

Step3. 調整根目錄 composer.json,以利測試

回到你的 laravel app 根目錄,修改 composer.json如下

{
  ...
  "psr-4": {
    "App\\": "app/",
    "Cw\\KafkaLogger\\": "packages/cw/kafkalogger/src/"
  }
}

設定好後 composer dump-autoload

Step4. 建立 ServiceProvider

用 ServiceProvider 是因為有 registerboot,不需要的話可以用其他方式建立
懶得打字的話直接用 php artisan make:provider YourServiceProvider,再把它 copy 到 src 底下,參考程式範例如下

<?php
namespace Cw\KafkaLogger;

use Illuminate\Support\ServiceProvider;

class KafkaLogServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        var_dump('hello my package');
    }
}

並在 config/app.php 加入包含 namespace 的 provider

'providers' => [
    ...
    Cw\KafkaLogger\KafkaLogServiceProvider::class,
    ...
]

Step5. 進行測試

使用內建的 server 即可測試php artisan serve,進到首頁看到如圖結果表示成功


部署至 github

跟一般的部屬一樣,但假如是開 private repo 的話要申請 token

使用 git-tag 進行版本控管

composer 對於使用 git 進行版控的 package 的版本定義是使用 tag,原因參考這裡,因此在部署時記得要把 tag 一起推上去,操作如列表

說明指令
add local taggit tag -a {版本號} -m '非必要的描述'
add remote taggit push --tags
remove local taggit tag -d {版本號}
add remote taggit push --delete [remotereponame] {版本號},不指定則為 origin

使用 composer 安裝

部署上去最的目的是使用 composer 安裝,composer 有指定 package 要去哪抓的設定,參考設定如下

{
  "require-dev": {
    "cw/kafkalogger": "1.0.*",
    ...
  },
  "autoload": {
    ...
    "psr-4": {
      "App\\": "app/"
    }
  },
  ...
  "repositories": [
    {
      "type": "vcs",
      "url": "git@ssh.dev.azure.com:v3/cwgroup/digital-products/kafkalogger"
    }
  ]
}

記得把 autoload 改回原本的樣子


Reference

cmd + /