如何实现生产环境加载远程git的composer包、开发环境加载本地包?
实现方案
你可以通过以下两种常用方案实现同一份composer.json适配多环境的包加载需求,无需多份配置文件维护:
方法1:双仓库优先级配置(自动适配,零额外操作)
Composer 会按照repositories数组从上到下的优先级匹配包源,可用的高优先级源会被优先使用,不可用的源会被自动跳过,你只要调整仓库配置顺序即可:
"repositories": [ { "type": "path", "url": "./packages/laravel-admin", "options": { "symlink": true } }, { "type": "vcs", "url": "https://github.com/igorhaf/laravel-admin" } ], "require": { "php": "^7.2.5|^8.0", "fideloper/proxy": "^4.4", "guzzlehttp/guzzle": "^7.4", "laravel/framework": "^7.0", "laravel/telescope": "^3.0", "laravel/tinker": "^2.5", "encore/laravel-admin": "dev-master" },
- 本地开发环境:提前把
laravel-admin源码放到项目根目录的./packages/laravel-admin路径下,执行composer install/composer update时会自动从本地目录加载,软链接配置会让你修改本地包代码后实时生效,无需反复更新依赖。 - 生产环境:不存在
./packages/laravel-admin目录时,Composer 会自动跳过本地path源, fallback 到后面的远程Git仓库拉取代码,无需修改任何配置。
方法2:本地配置覆盖(更灵活,本地配置不进版本库)
如果你不想把本地开发相关的配置写到公共的composer.json里,可以用Composer默认支持的本地配置覆盖机制:
- 主
composer.json保持你原本的生产环境配置不变,不需要做任何修改。 - 在项目根目录新建
composer.local.json文件,写入本地开发专属配置:
{ "repositories": [ { "type": "path", "url": "./packages/laravel-admin", "options": { "symlink": true } } ] }
- 把
composer.local.json添加到项目的.gitignore文件中,避免该本地配置被提交到远程版本库。
- 本地环境:Composer会自动合并
composer.local.json的配置到主配置,且本地配置优先级更高,会优先从本地目录加载包。 - 生产环境:不存在该本地配置文件,会直接使用主配置里的远程源加载包。
注意事项
两种方案都不需要修改require段中encore/laravel-admin的版本约束,如果你本地开发用的分支不是master,只需要把版本约束改为对应分支名即可,比如本地用dev分支的话改为dev-dev。
内容的提问来源于stack exchange,提问作者IgorHerson
相关产品推荐
相关产品推荐

