Detect Packages
The detect-packages command scans PHP source directories for PSL namespace usage and reports which php-standard-library/* standalone packages are needed. This helps migrate from the monorepo to individual packages.
This tool is only available when using the monorepo (php-standard-library/php-standard-library).
Usage
vendor/bin/psl detect-packages <path>... [--dev <path>...] [--composer]
Options
| Option | Description |
|---|---|
--src |
Mark following paths as require dependencies (default) |
--dev |
Mark following paths as require-dev dependencies |
--composer |
Output a JSON snippet for composer.json |
Examples
Basic scan
Scan a single source directory:
vendor/bin/psl detect-packages src/
Detected PSL packages:
require:
php-standard-library/dict
php-standard-library/foundation
php-standard-library/str
php-standard-library/vec
Separating require and require-dev
Scan source and test directories separately. Packages found in both are placed in require only:
vendor/bin/psl detect-packages src/ --dev tests/
Detected PSL packages:
require:
php-standard-library/dict
php-standard-library/foundation
php-standard-library/str
php-standard-library/vec
require-dev:
php-standard-library/filesystem
php-standard-library/os
JSON output for composer.json
Use --composer to get output you can paste directly into your composer.json:
vendor/bin/psl detect-packages src/ --dev tests/ --composer
{
"require": {
"php-standard-library/dict": "^6.1",
"php-standard-library/str": "^6.1",
"php-standard-library/vec": "^6.1"
},
"require-dev": {
"php-standard-library/filesystem": "^6.1",
"php-standard-library/os": "^6.1"
}
}
Multiple source paths
You can pass multiple directories. Bare paths default to require:
vendor/bin/psl detect-packages src/ lib/ --dev tests/
How it works
The tool scans all .php files in the given directories and matches Psl\<Namespace> references using regex. Each namespace is mapped to its corresponding standalone package. The foundation package is always included when any PSL usage is detected, since all PSL packages depend on it.
Transitive dependencies are not resolved — only direct usage in your code is reported. Composer handles transitive dependencies automatically when you install the standalone packages.