PHP Composer Repository Quick Reference (V2)
Configuration
Repository config (hosted)
json
{ "type": "Hosted" }Repository config (proxy)
json
{
"type": "Proxy",
"config": {
"routes": [
{ "url": "https://repo.packagist.org", "name": "Packagist" }
]
}
}Notes:
- Routes may be edited in the Admin UI; the first route is tried first. Empty routes fall back to the Packagist default.
- Proxy repos are read-only. Dist files and p2 metadata are cached on first request and served from Nitro with rewritten
dist.urlvalues.
Composer client configuration
composer.json (project):
json
{
"repositories": [
{ "type": "composer", "url": "https://your-host/repositories/<storage>/<php-repo>" }
],
"require": { "mycompany/mypackage": "^1.0" }
}auth.json:
json
{
"http-basic": {
"your-host": { "username": "user", "password": "pass" }
}
}Upload (hosted)
- Zip must contain
composer.jsonwith validname(vendor/package) andversion. - Accepted dist path shapes (both work):
dist/<vendor>/<package>/<version>.zip(recommended; simplest)dist/<vendor>/<package>/<version>/<filename>.zip
- Upload example (recommended shape):
bash
curl -u user:pass -X PUT \
-T dist/mycompany-mypackage-1.0.0.zip \
https://your-host/repositories/<storage>/<php-repo>/dist/mycompany/mypackage/1.0.0.zipNitro Repo extracts composer.json, validates name + version against the path, rewrites dist.url back to Nitro, and writes p2 metadata to /p2/mycompany/mypackage.json (plus ~dev when relevant).
Proxy behavior (Packagist caching)
- Point Composer at the proxy repo URL (same URL shape as hosted). No client-side changes are required beyond the repository entry.
- First metadata request (
p2/<vendor>/<package>.json) is fetched from upstream, rewritten sodist.urlpoints at Nitro, stored underp2/..., and indexed in the catalog. - First dist download streams from upstream while being cached under
dist/<vendor>/<package>/<version>/<filename>. - Subsequent installs are served from Nitro’s cache; upstream is not hit again unless the cache entry is removed.
- Admin ➜ Repository ➜ Packages tab shows cached dist files/versions; deleting a cache path evicts both storage and catalog entries.
Client fetch paths (Composer V2)
- Root:
/repositories/<storage>/<php-repo>/packages.json(contains onlymetadata-url) - Metadata:
/repositories/<storage>/<php-repo>/p2/<vendor>/<package>.json - Dist:
/repositories/<storage>/<php-repo>/dist/<vendor>/<package>/<version>.zip(or/dist/<vendor>/<package>/<version>/<filename>.zipwhen the upstream filename must be preserved)
Useful Composer commands
bash
composer install # install all deps
composer require mycompany/mypackage:^1.0
composer update mycompany/mypackage
composer config --global http-basic.your-host user passPackage layout reminder
my-package/
├── composer.json
├── src/
└── tests/Minimal composer.json:
json
{
"name": "mycompany/mypackage",
"version": "1.0.0",
"type": "library",
"require": { "php": ">=7.4" },
"autoload": { "psr-4": { "MyCompany\\MyPackage\\": "src/" } }
}