Harness Artifact Registry provides support for PHP Composer packages, allowing you to host private PHP libraries.
Overview
Composer registry features:
- Standard Composer repository protocol
- Package metadata from
composer.json
- Version management
- PSR-4 autoloading support
- Integration with Composer CLI
Pushing Composer packages
Use the hc artifact push composer command:
hc artifact push composer <registry-name> <package-file-path> \
--pkg-url <pkg-url>
Package files are typically .zip archives containing your PHP source code and composer.json
Creating Composer packages
Create composer.json
Define your package metadata:{
"name": "vendor/package-name",
"description": "My PHP library",
"version": "1.0.0",
"type": "library",
"require": {
"php": ">=8.0"
},
"autoload": {
"psr-4": {
"Vendor\\Package\\": "src/"
}
}
}
Package your library
Create a zip archive:zip -r vendor-package-1.0.0.zip . -x '*.git*' 'vendor/*' 'tests/*'
Upload to registry
Push the package:hc artifact push composer my-registry ./vendor-package-1.0.0.zip \
--pkg-url https://app.harness.io/registry/pkg
Installing Composer packages
Configure Composer to use your Harness registry:
In composer.json
Add the repository to your project’s composer.json:
{
"repositories": [
{
"type": "composer",
"url": "https://<registry-url>/packages.json"
}
],
"require": {
"vendor/package-name": "^1.0"
}
}
Authentication
Configure authentication in auth.json:
{
"http-basic": {
"<registry-url>": {
"username": "your-username",
"password": "your-harness-token"
}
}
}
Add auth.json to .gitignore to avoid committing credentials
Install packages
Examples
# Create and push a package
zip -r mypackage-1.0.0.zip . -x '*.git*' 'vendor/*'
hc artifact push composer my-registry ./mypackage-1.0.0.zip \
--pkg-url https://app.harness.io/registry/pkg
Composer.json requirements
Minimal composer.json:
{
"name": "vendor/package",
"version": "1.0.0",
"type": "library"
}
Recommended fields:
{
"name": "vendor/package",
"description": "Package description",
"version": "1.0.0",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Your Name",
"email": "[email protected]"
}
],
"require": {
"php": ">=8.0"
},
"autoload": {
"psr-4": {
"Vendor\\Package\\": "src/"
}
}
}
Package naming
Composer packages follow the convention:
Examples:
acme/framework ✅
mycompany/utils ✅
mypackage ❌ (missing vendor)
CI/CD integration
- name: Package and publish
run: |
zip -r package-${{ github.ref_name }}.zip . -x '*.git*' 'vendor/*'
hc artifact push composer my-registry ./package-*.zip \
--pkg-url https://app.harness.io/registry/pkg
env:
HARNESS_API_KEY: ${{ secrets.HARNESS_API_KEY }}
publish:
script:
- zip -r package-$CI_COMMIT_TAG.zip . -x '*.git*' 'vendor/*'
- hc artifact push composer my-registry ./package-*.zip --pkg-url $PKG_URL
variables:
HARNESS_API_KEY: $HARNESS_TOKEN
only:
- tags
Troubleshooting
Validate your composer.json:
Ensure the package name in composer.json matches what you’re requiring:# Check uploaded packages
hc artifact list --registry my-registry
Verify your auth.json configuration:# Test authentication
composer diagnose
See also