nscreed/laravel-migration-paths
Laravel Migration Paths lets you register additional migration directories beyond the default database/migrations folder. Keep package, module, or domain migrations organized and discoverable while running artisan migrate normally.
composer require as usual, then publish the config if the package ships one (php artisan vendor:publish --tag=...). The config file is the first place to look: it defines the base roots the resolver is allowed to work from.base_path()-relative resolution was effectively the boundary. If you previously hit errors resolving a sibling directory, a monorepo package, or a shared assets folder, upgrade and retest that case first.assets/, a monorepo packages/ directory, or a mounted volume in a container. Configure that root once, then ask the package for subpaths rather than concatenating ../ yourself.php artisan tinker by resolving a known external directory and comparing it to realpath() output. This tells you whether the resolver returns canonical paths, preserves symlinks, or returns a normalized-but-not-canonical path.../../ traversals.config/...php reading env()), and let the package handle joining and normalization.config/filesystems.php, when generating storage links, or when pointing at externally published assets. This is the common integration seam.dirname(base_path()) . '/shared' or manual realpath() juggling to escape the app root, replace it with the package's resolver now that 1.2.0 fixes it. This is a bug-fix/minor release, so no code changes should be needed beyond deleting those workarounds... segments. Normalization rules for foo/../bar, duplicate separators, and trailing slashes may not match realpath(). Don't compare resolved strings to hand-built paths in tests; compare canonicalized forms.open_basedir/disable_functions settings; a resolution fix does not grant read access.php artisan config:clear (and remember config:cache in deploy scripts). A stale cache will make the new root appear unsupported and look like a regression.Storage or file_get_contents.realpath($input). If they diverge, the issue is normalization or existence, not the package's root handling.How can I help you explore Laravel packages today?