/package-scoper

[READ-ONLY] Scope package in unique namespace to prevent composer install conflicts - with 1 click

Primary LanguagePHPMIT LicenseMIT

Package Scoper

Downloads total

  • Does your package require Symfony 5, but developers want to use it on Symfony 3?
  • Do you want to scope your package dependencies with unique namespace, but don't know how?
  • Do you want to skip learning of PhpScoper, PHAR packing, Box and GitHub Actions automated deploy?

You're in the right place!

Install

composer require symplify/package-scoper symplify/monorepo-builder --dev

We also need symplify/monorepo-builder, so we can work with relative paths of local packages.

Usage

1. Generate php-scoper Config

php-scoper is a package that prefixes classes and functions, so they're unique and don't conflict with same-named class in a different version. You can read the documentation, or you can generate the config with sane defaults:

vendor/bin/package-scoper generate-php-scoper

It will create scoper.inc.php right in the root of the package. That's the best location, because php-scoper works with path relative to its location.

2. Scope Composer Json

Scoping PHP code with php-scoper is just the first step. The second is making a composer.json with a different name than the original package. We got you covered! The following command will:

  • update package name to <original>-prefixed
  • keep PHP version in require section, license and bin files
  • drop the rest

It must be run on the scoped package composer.json, not the original one:

vendor/bin/package-scoper scope-composer-json <path-to-composer-json>

vendor/bin/package-scoper scope-composer-json packages-scoped/some-package/composer.json

3. Generate GitHub Action Workflow

The process without automatization would not be much helpful. That's why we have GitHub Action to automate it.

vendor/bin/package-scoper generate-workflow

Go to your .github/workflows folder, update packages names manually and you're ready to go.

Convention over Configuration in GitHub Action

In the GitHub Workflow you only define package names. To make the whole process work, the <package-name> must be used in:

  1. directory name
/package/<package-name>
  1. binary file name:
/package/<package-name>/bin/<package-name>

As the file is defined in the composer.json:

{
    "bin": [
        "bin/<package-name>"
    ]
}