spiral/roadrunner-cli
RoadRunner CLI provides commands to install the latest RoadRunner binary compatible with your OS and architecture and to generate example .rr.yaml configuration files. Use options like plugin and preset to create focused configs for your project.
Architecture fit: Still the right package for Laravel/PHP teams running RoadRunner, but the fit has changed shape. roadrunner-php/cli 3.0.0 is no longer a maintenance-level bump — it is a platform migration package that targets RoadRunner server v3 exclusively. The dependency chain is now Laravel app → CLI 3.x → RoadRunner 3.x → rewritten .rr.yaml. Teams on RoadRunner 2.x cannot adopt this without migrating the server, which makes the CLI upgrade a coupled infrastructure project rather than a Composer bump.
Integration feasibility: Feasible but conditional. The public surface (Symfony console commands, config generation) is stable in intent; everything under Command, Configuration, Downloader, Environment, Archive, and Repository has moved to Internal\* or been removed. Any Laravel app with custom commands extending Spiral\RoadRunner\Console\Command, custom OptionInterface implementations, or code calling Environment\Enum / Environment\*\Factory will break at autoload. Most Laravel apps use this package as a black box (vendor/bin/rr get-binary, config generation), so the blast radius is smaller than the changelog suggests — but that must be confirmed, not assumed.
Technical risks:
get-binary in CI will silently pull an RR3 binary under an RR2 runtime.tcp, websockets, broadcast, and reload are gone because RR3 does not ship them. Any .rr.yaml using them — or Laravel code relying on the reload/broadcast semantics — must be re-architected, not just edited.symfony/console and symfony/http-client 6.4+ are now required. The prior assessment's concern about Symfony 8.0 behavior is largely resolved, but the floor is a real constraint for pinned Laravel 9 apps.RR_GITHUB_API_URL must be exactly https://api.github.com or end with /api/v3, and the token moves from GITHUB_TOKEN to DLOAD_TOKEN_<HOST> (e.g. DLOAD_TOKEN_GHE_EXAMPLE_COM). GitHub.com users are unaffected; GHES users must rotate CI secrets or binary downloads fail.Command, Configuration, Downloader, Environment internal removes any SemVer guarantee for those classes going forward. Extension points should be treated as unsupported.Key questions:
^2.7 deliberately..rr.yaml in any environment reference the removed tcp, websockets, broadcast, or reload plugins? What replaces them in our topology (websocket fan-out, zero-downtime reload)?Spiral\RoadRunner\Console\*? If yes, they need rewriting before upgrade, not after.DLOAD_TOKEN_<HOST>?Stack fit:
.rr.yaml and plugin model change is the real integration work; the CLI is the easy part.nsq, kafka, google_pub_sub, centrifuge, protoreg): a genuine capability unlock for teams moving queues/broadcast off the removed plugins — this is the migration path for broadcast/websockets, not a workaround.Migration path:
roadrunner-php/cli:^2.7, freeze binary downloads to 2.x) or commit to RR3 (CLI ^3.0). Do not run mixed.get-binary invocations, no wildcard in any pipeline..rr.yaml across dev/staging/prod for the four removed plugins; design replacements (Centrifuge/Kafka/NSQ for broadcast; platform-level reload strategy).Spiral\RoadRunner\Console in application and tooling code; rewrite or delete any extension points..rr.yaml — review the RR3 output before it ever reaches a running deployment.Compatibility:
RR_GITHUB_API_URL and DLOAD_TOKEN_<HOST> are corrected.Maintenance: Active development continues and the package is clearly being steered toward RR3, which is a good long-term signal but a poor short-term one for anyone mid-migration. The internal-namespace decision means future minor releases may restructure code without SemVer protection — we should consume only the CLI binaries and generated config, never the classes. Budget recurring effort for tracking RR3 releases rather than assuming this is a one-time upgrade.
Support: Fallback is roadrunner-php/cli ^2.7, which remains valid while the server is RR2 — keep that constraint documented and reversible. For troubleshooting, the --verbose workflow still applies; the DLoad documentation now covers musl selection and DLoad side effects, which is the fastest path when binary downloads misbehave. One quiet improvement worth noting: config generation no longer writes a broken .rr.yaml on failure, removing a historically nasty support case.
Scaling: This is where the release has real operational weight. Removing tcp, websockets, broadcast, and reload from RR3 means our scaling and deployment story changes: websocket fan-out needs a dedicated broker (Centrifuge being the natural fit given the new config section), and zero-downtime reload moves from a RoadRunner plugin to platform-level orchestration. Capacity planning for worker pools and the CLI surface itself is unchanged; the messaging layer is not.
Failure modes:
RR_GITHUB_API_URL suffix or stale GITHUB_TOKEN — CI breaks at binary fetch, which reads as an infrastructure fault rather than a package change.Ramp-up: No longer "low effort." Realistically: low engineering effort to install, medium-to-high effort to migrate safely, dominated by the RR3 server move and .rr.yaml rewrite rather than by the package itself. Plan an audit sprint, a staging canary, and a documented rollback to the 2.7 line before scheduling the production cutover.
How can I help you explore Laravel packages today?