存储库部署和Composer:什么工作流程?

时间:2013-01-24 10:03:28

标签: php git deployment composer-php

作为一名PHP开发人员,我发现自己经常使用Composer。在过去它是在个人项目等等,所以我没有太多问题,但现在在Laravel 4项目中需要进行部署,我很难适应我的工作流程。

我的所有项目都是git存储库,因此按照惯例,因为它仍然非常错误,像大多数开发人员一样,我将vendor目录放在我的.gitignore中。 现在的问题是:我还使用Git部署到服务器,并且所有逻辑都没有上传供应商目录,因为它没有被存储库跟踪。

所以我的问题是那些与Composer和Git合作的人比我更长的时间:保持服务器同步的最佳工作流程是什么?如何跟踪供应商文件夹而不真正跟踪它? 我每次使用Composer更新时都尝试上传它,但我的一些供应商文件夹非常大,每次更新时我都无法手动上传30Mb的文件。

我真的不知道,你们怎么解决这个问题?我试着不忽略vendor文件夹,但是Git只是搞砸了,有一半被认为是克隆的回购,而且无论如何都被忽略等等。

更新:请注意,我在共享主机上,因此无法访问服务器的终端。

6 个答案:

答案 0 :(得分:8)

最好的方法是在更新到最新代码后在服务器上运行composer install。您还应确保提交composer.lock文件,然后服务器将使用该文件进行安装(您不应在服务器上运行composer update)。

答案 1 :(得分:4)

Capistrano(或Capifony,如果您使用的是Symfony2)对于使用composer的部署非常有用。您可以远程触发部署,它将独立运行作曲家安装,以便站点保持联机状态,直到成功部署。还有许多其他好处,例如保留以前的部署和回滚,在部署之前复制旧供应商,编译资产等等。

答案 2 :(得分:4)

我正在服务器上的git post-receive hook中处理类似的事情。这没有经过测试,也可能有问题,但你应该明白这一点。

#!/bin/bash
# get the updated composer.json
git checkout master -- composer.json

# only do this stuff if composer.json is different
# you could check this manually, or with git or cmp
cp composer.json tmp/composer.json

# may take a minute, but won't take the site down
(cd tmp; composer install --prefer-dist)

# this doesn't seem to be atomic
git checkout -f

# switch vendors over
# this isn't quite an atomic operation, but is very close
# you could probably do it with symlinks and "mv -Tf" to make it atomic
mv vendor vendor.old
mv tmp/vendor vendor

rm -r tmp vendor.old

理想情况下,除git checkout之外的所有部署(在本例中为composer installmv)都会在www之外单独发生。如果您在工作树中有未跟踪的文件(例如CMS上传)并且依赖于PHP的__FILE__未解析符号链接(由于此PHP bug),则此方法无效。

答案 3 :(得分:2)

这是一个老问题,但万一有人在寻找解决方案:

我稍微修改@ dave1010答案,使用git pull代替git checkout--force

#!/bin/bash
# get only composer files 
git fetch
git checkout origin/master -- composer.json
git checkout origin/master -- composer.lock

# make sure tmp is empty
rm -rf tmp
mkdir tmp

# copy the composer files to tmp
cp -r vendor tmp/vendor
cp composer.json tmp/composer.json
cp composer.lock tmp/composer.lock

# may take a minute, but won't take the site down
(cd tmp; composer install --no-scripts --verbose; cd ..)

# switch vendors over
rm -rf vendor_old
mv vendor vendor_old
mv tmp/vendor vendor

# update your code
git pull

# run again composer install. This time will print 'Nothing to install or update'
# but will execute pre/post scripts & generate autoload files
composer install --optimize-autoloader

使用capistrano/composer可能有更好的解决方案。但我更喜欢我的。

答案 4 :(得分:1)

你可以使用像jenkins这样的东西来ftp你的文件,你可以指导jenkins在jenkins服务器上运行composer install然后ftp文件。

这也允许您忽略供应商文件夹。

它确实需要构建服务器,您需要能够执行命令与构建服务器

答案 5 :(得分:-1)

密钥是您的composer.lock文件。 composer.lock会准确跟踪您安装的软件包(和版本)。部署时,也将composer.lock文件发送到生产服务器,然后只需执行composer update。将安装所有完全相同的软件包版本。使用像Capistrano或Flightplan这样的部署软件,您可以将composer update步骤作为流程的一部分,以便自动发生。