Bitbucket Pipeline FTP部署忽略vendor文件夹问题排查
你的Bitbucket Pipeline部署问题:vendor目录被忽略的原因与解决办法
为什么vendor文件夹没被部署?
这是个很常见的误区,核心问题出在git ftp的工作逻辑上:
git ftp是基于Git版本追踪的文件来同步的,而PHP项目里vendor/目录几乎都会被加到.gitignore里(这是行业最佳实践,避免把依赖文件提交到仓库)。所以哪怕你通过artifacts把vendor/成功传到了部署步骤,git ftp依然会无视它——因为它不在Git的追踪列表里。- 你的
artifacts配置本身是没问题的,vendor/**确实会被传递到部署步骤,但git ftp init只会扫描当前Git仓库里被追踪的文件,不会处理管道中生成的未追踪文件。
优化方案
针对这个场景,我推荐几个实用的解决方向:
方案1:在部署步骤直接安装依赖(最推荐)
把composer install移到部署阶段,这样不需要依赖artifacts传递vendor目录,还能针对生产环境做优化:
init: - step: name: Build & Test image: php:7.1.1 caches: - composer script: - apt-get update && apt-get install -y unzip - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - composer install - vendor/bin/phpunit - step: image: php:7.1.1 name: Deployment caches: - composer script: - apt-get update && apt-get install -y unzip git-ftp - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 生产环境建议关闭dev依赖,优化自动加载 - composer install --no-dev --optimize-autoloader # 首次部署用init,后续更新换成git ftp push,避免重复上传所有文件 - git ftp init -u "$FTP_DEV_USERNAME" -p "$FTP_DEV_PASSWORD" ftp://$FTP_DEV_HOST/$FTP_DEV_FOLDER
优势:保持.gitignore的最佳实践,不需要处理artifacts的传递问题,生产环境的依赖更精简。
方案2:强制git ftp包含vendor目录
如果你一定要用artifacts传递vendor,可以用git ftp的--include参数强制上传未追踪的目录:
init: - step: name: Build image: php:7.1.1 caches: - composer script: - apt-get update && apt-get install -y unzip - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - composer install - vendor/bin/phpunit artifacts: - vendor/** - step: image: samueldebruyn/debian-git name: Deployment script: - apt-get update - apt-get -qq install git-ftp # 用--include指定上传未被Git追踪的vendor目录 - git ftp init --include=vendor/ -u "$FTP_DEV_USERNAME" -p "$FTP_DEV_PASSWORD" ftp://$FTP_DEV_HOST/$FTP_DEV_FOLDER
注意:后续更新部署时,也要加上--include=vendor/参数,否则git ftp push不会同步vendor目录的变更。这种方式不如方案1优雅,只适合临时场景。
方案3:改用rsync替代git ftp(如果支持SSH)
如果你的目标服务器支持SSH,用rsync会更灵活——它直接同步目录,完全不受Git追踪的限制:
init: - step: name: Build image: php:7.1.1 caches: - composer script: - apt-get update && apt-get install -y unzip - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - composer install - vendor/bin/phpunit artifacts: - vendor/** - ./** # 同步所有项目文件(排除.git相关) - step: image: php:7.1.1 name: Deployment script: - apt-get update && apt-get install -y rsync openssh-client # 同步本地目录到远程服务器,排除Git相关文件 - rsync -avz --exclude='.git/' --exclude='.gitignore' ./ "$SSH_USER@$SSH_HOST:$REMOTE_FOLDER"
优势:能同步任何你需要的文件,包括vendor,适合复杂的部署场景,同步效率也比git ftp高。
额外小贴士
- 生产环境部署时,一定要用
composer install --no-dev --optimize-autoloader,去掉开发依赖,同时优化自动加载器的性能。 - 确保Bitbucket Pipelines的
composer缓存配置正确,这样能大幅加快依赖安装的速度。 - 首次部署用
git ftp init,后续更新记得换成git ftp push,不然每次都会重新上传所有文件,浪费时间。
内容的提问来源于stack exchange,提问作者Hajan
相关产品推荐
相关产品推荐

