Skip to content

Opret et nyt Composer Package

Denne guide beskriver hele flowet fra idé til publiceret internt package, der kan kræves fra andre projekter.


Forudsætninger

  • GitHub-adgang til acme-organisationen
  • composer installeret lokalt (≥ 2.0)
  • git konfigureret med SSH-nøgle til GitHub

1. Opret GitHub-repo

Opret et nyt privat repo under acme/-organisationen med navnekonventionen:

acme/<domæne>-package
# Eksempler:
acme/auth-package
acme/billing-package
acme/notification-package

Vælg: PHP .gitignore-template, MIT License, ingen readme (vi opretter den selv).


2. Bootstrap lokalt

mkdir auth-package && cd auth-package
git init
git remote add origin git@github.com:acme/auth-package.git  # TODO: Ret org-navn

3. composer.json

Minimum composer.json for et internt package:

{
    "name": "acme/auth-package",
    "description": "Intern autentificeringslogik delt på tværs af ACME-projekter",
    "type": "library",
    "license": "MIT",
    "require": {
        "php": "^8.2"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0",
        "phpstan/phpstan": "^1.10"
    },
    "autoload": {
        "psr-4": {
            "Acme\\Auth\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Acme\\Auth\\Tests\\": "tests/"
        }
    },
    "config": {
        "sort-packages": true,
        "allow-plugins": {
            "phpstan/extension-installer": true
        }
    },
    "minimum-stability": "stable",
    "prefer-stable": true
}

Navnekonvention

Brug acme/<navn> som Composer package-navn og Acme\<PascalCase>\ som root namespace.


4. Mappestruktur

auth-package/
├── src/
│   └── AuthManager.php     # Primær entry point
├── tests/
│   └── AuthManagerTest.php
├── docs/
│   └── README.md           # Synkroniseres til Engineering Handbook
├── .github/
│   └── workflows/
│       ├── tests.yml       # Kør PHPUnit ved PR
│       └── notify-handbook.yml  # Trigger handbook-sync
├── CHANGELOG.md
├── composer.json
└── README.md

5. CI/CD checklist

Opret .github/workflows/tests.yml:

name: Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: "8.2"
          coverage: xdebug
      - run: composer install --prefer-dist --no-progress
      - run: vendor/bin/phpunit --coverage-text
      - run: vendor/bin/phpstan analyse src --level=8

Opret .github/workflows/notify-handbook.yml for at trigge sync til Engineering Handbook:

name: Notify Engineering Handbook

on:
  push:
    branches: [main]
    paths:
      - "docs/**"

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Dispatch til eng-handbook
        run: |
          curl -X POST \
            -H "Authorization: Bearer ${{ secrets.HANDBOOK_DISPATCH_TOKEN }}" \
            -H "Accept: application/vnd.github+json" \
            https://api.github.com/repos/acme/eng-handbook/dispatches \
            -d '{
              "event_type": "package-updated",
              "client_payload": {
                "package": "auth-package",
                "repo": "acme/auth-package",
                "branch": "main",
                "docs_path": "docs/README.md"
              }
            }'

Secret

HANDBOOK_DISPATCH_TOKEN skal være et PAT med repo-scope, oprettet af en admin og tilføjet som secret i dette repo.


6. Publicér første version

# Commit al kode
git add .
git commit -m "feat: initial package setup"
git push -u origin main

# Tag første version
git tag v1.0.0
git push origin v1.0.0

7. Brug packaget fra et andet projekt

Tilføj repoet til projektets composer.json:

{
    "repositories": [
        {
            "type": "vcs",
            "url": "git@github.com:acme/auth-package.git"
        }
    ]
}

Derefter:

composer require acme/auth-package:^1.0

PR Checklist

Inden du merger til main på et package-repo:

  • composer install kører uden fejl
  • Alle tests er grønne (vendor/bin/phpunit)
  • PHPStan level 8 er grøn (vendor/bin/phpstan analyse src)
  • CHANGELOG.md er opdateret
  • Breaking changes er kommunikeret i PR-beskrivelsen
  • Version er tagget korrekt (semver: v1.2.3)
  • docs/README.md er opdateret hvis API er ændret