Laravel 项目抽离 vendor 目录的问题
第一次来问问题,最近才用laravel框架,之前一直用yaf及公司自研框架
核心的问题是:希望把vendor目录从项目代码中抽离出来,实现单独部署vendor并几个项目共用一个vendor。
遇到的问题是:把vendor目录拷贝出来到一个单独目录,然后软连接ln -s
到项目目录中的vendor,但它不工作,找到的原因是laravel框架引入项目文件时是从单独出来的vendor目录查找,所以很显然是找不到的。
把vendor抽离出来的原因是:希望自动化部署,不希望每次增加新包或者更新包的时候在部署的时候需要composer require
,单独部署vendor。
生成环境运行
composer
真的很蛋疼
有没有同学抽离过vendor,分享一下经验。
@Wi1dcard 提供了比较成熟的部署方案。
刚刚我也解决了vendor抽离只后autoload不到的问题
在bootstrap注册autoload就可以了。
./bootstrap/app.php
<?php
require_once __DIR__ . '/../vendor/autoload.php';
$autoload = new Composer\Autoload\ClassLoader();
$autoload->addPsr4('App\\', "../app/");
$autoload->addClassMap([
"database/",
"tests/"
]);
$autoload->register();
非常感谢大家的意见和建议。
@Thinklong
vendor
绝对不应该进入版本管理,应当进入版本管理的是 lock,同一个 lock 安装出来的依赖应当是完全一致的。在服务器上直接
composer install
也是可以的,但是就需要一套编排 / 部署系统来调度,如果遇到某台机器安装依赖失败,那么就不能把流量导向过去(不需要全部重新部署)。目前来看比较优秀的方案是 Kubernetes,很多国内厂也做了不少类似的轮子项目,你可以自行 Google。其实没多少压力。
composer install
主要就是网络流量的消耗,根据你的方案,这台「部署机」应当是个长期存在的实例,包含着每次依赖安装产生的 Composer global cache,而项目的依赖变动一般不会太大,所以每次 Install 其实没什么压力。如果是担心「部署机」到「目标机」的网络流量消耗的话,现在云服务商都有 VPC 功能,直接走内网即可。按照这个方案施行的话,我推荐一个工具:Ansible。
最后,你提到的方案是「所谓部署机」
推
代码到「实际服务器」。如果有做 CI 的话,我还是更推荐 CI 上只打 Artifact 并上传到对象存储,随后通知「实际服务器」到对象存储拉
代码。