joshbrw/laravel-module-installer
Composer installer that places Laravel modules in a custom Modules directory instead of vendor, so module code stays editable and autoload-friendly. A lightweight drop-in for modular Laravel projects, commonly used alongside nwidart/laravel-modules.
Architecture fit. joshbrw/laravel-module-installer is not a runtime library — it is a Composer plugin that registers a custom installer for packages declaring "type": "laravel-module", redirecting their install path from vendor/ to the application's Modules/ directory. This makes it an install-time concern only: no service provider, no runtime coupling, no autoload surface added to the app. For teams already using nwidart/laravel-modules and distributing modules as Composer packages, the fit is clean and the blast radius is small because the plugin is inert outside composer install/update.
Integration feasibility. Feasible but conditional. It requires (a) nwidart/laravel-modules conventions in the consuming app, (b) each module published as a Composer package with type: laravel-module, (c) a repository entry (VCS, path, or private Packagist) for those modules, and (d) Composer plugin execution permitted. The last point is the practical blocker: since the last release (Jan 2021), Composer 2.2+ introduced the allow-plugins secure default and Composer 2.5 hardened it. Any environment that has not explicitly allowed this plugin will fail installs or, worse, silently resolve modules into vendor/.
Technical risk. High for a 171-star, single-purpose plugin last released in 2021:
composer-plugin-api constraint compatible with the installed Composer binary. A 2021-era constraint is likely incompatible with current Composer 2.x lines and will either be rejected or force a Composer downgrade.nwidart/laravel-modules v10/v11 changes.Key questions.
composer-plugin-api constraint does the current tag declare, and does it install without --ignore-platform-reqs on our Composer version?allow-plugins, and what is the exact allow-list entry?nwidart/laravel-modules v10+/v11 supported, or only the older Modules/ layout?composer/installers + oomphinc/composer-installers-extender type mapping, or a path-repository strategy — that removes the dependency entirely?Stack fit. Valid only for Laravel applications on nwidart/laravel-modules that consume modules as external Composer packages. If modules live in-repo (the common case), the plugin adds no value and should not be introduced. It is a fit for platform teams distributing a shared module catalog to multiple downstream apps.
Migration path. Three viable routes, in order of preference:
composer/installers with oomphinc/composer-installers-extender to map laravel-module to Modules/{{name}}. This replaces a stale plugin with actively maintained Composer tooling and yields the same on-disk layout.composer-plugin-api constraint, add a CI matrix against current Composer and PHP, and publish internally.allow-plugins entry, with a scheduled re-evaluation.Compatibility. Must be validated on four axes before adoption: Composer version (composer-plugin-api), PHP version, nwidart/laravel-modules major, and whether modules declare type: laravel-module in their own composer.json. Any mismatch in the type field silently routes modules to vendor/ — a failure that only surfaces when the app can't find its modules.
Sequencing.
type field.allow-plugins pinned.installers-extender route on the same fixture; prefer it if parity holds.composer install with modules restored via path repo).Maintenance. This is the dominant cost. An unmaintained Composer plugin becomes a pinned-Composer liability: every Composer upgrade is a compatibility gate. Budget either a fork-and-maintain line item (small codebase, but requires a Composer-fluent owner) or a planned migration to composer/installers-based mapping. Do not let it become permanent infrastructure.
Support. Community support is thin — 171 stars, no recent releases, no evidence of active issue triage. Internal teams will be their own support tier. Documentation of the laravel-module package type and Modules/ path convention must be written and owned internally; the upstream README is not a substitute.
Scaling. Works acceptably for a modest catalog of internal module packages. At larger scale, Composer plugin execution adds to install time, and multi-repo module distribution increases resolution and cache complexity. Evaluate whether a monorepo with path repositories removes the need for a custom installer entirely — often the cheapest scaling answer.
Failure modes. The critical ones: (1) plugin blocked by allow-plugins → install aborts or modules land in vendor/; (2) composer-plugin-api constraint mismatch → dependency resolution failure or forced Composer downgrade; (3) module package missing type: laravel-module → silent misplacement, discovered at runtime; (4) PHP deprecation warnings on 8.2+ surfacing as CI noise; (5) stale plugin interacting unpredictably with nwidart/laravel-modules v10+ layouts. Each needs a documented symptom and remediation.
Ramp-up. Low for engineers comfortable with Composer custom installers; moderate for those who have only used composer require. The hidden cost is institutional knowledge about Composer plugin governance (allow-plugins, plugin API versioning), which most Laravel teams have never had to reason about. Plan a short internal write-up plus a known-good composer.json template before broader rollout. Given the package's age, low score, and the availability of maintained alternatives, the recommendation is to treat it as a stopgap at most — validate the composer/installers-extender path first.
How can I help you explore Laravel packages today?