You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:30:50