存储库部署和编辑器:什么工作流程


Repository deployment and Composer : what workflow?

作为一名PHP开发人员,我发现自己经常使用Composer。过去它是在个人项目等上,所以我没有太多问题,但现在使用 Laravel 4,它是需要部署的项目,我正在努力调整我的工作流程。

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

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

我真的不知道,你们是怎么解决的?我试着不忽略vendor文件夹,但 Git 只是把它搞砸了,一半被识别为克隆存储库,无论如何都被忽略了,等等。

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

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

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

我正在服务器上的 git 接收后钩子中处理类似的事情。这未经测试,可能有问题,但你应该明白这个想法。

#!/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

理想情况下,除了一个mv之外,所有部署(即在这种情况下是git checkoutcomposer install)都将在www之外孤立地进行。如果您在工作树中有未跟踪的文件(例如 CMS 上传)并且依赖 PHP 的__FILE__不解析符号链接(由于此 PHP 错误),则这不起作用。

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

我稍微修改了@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。但我更喜欢我的。

你可以使用 jenkins 这样的东西来 ftp 你的文件,这样

你可以指示 jenkins 在 Jenkins 服务器上运行 composer install,然后用 ftp 文件。

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

它确实需要构建服务器,并且您需要能够执行命令而不是构建服务器

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