19

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

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

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

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

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

4

6 回答 6

9

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

于 2013-01-24T12:12:31.267 回答
4

Capistrano(或 Capifony,如果您使用 Symfony2)对于使用 composer 进行部署非常有用。您可以远程触发部署,它将单独运行 composer 安装,因此站点在成功部署之前保持在线。还有许多其他好处,例如保留以前的部署和回滚,在部署之前复制旧供应商,编译资产等。

于 2013-06-28T14:50:13.623 回答
4

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

#!/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和)都将在. 如果您的工作树中有未跟踪的文件(例如 CMS 上传)并且依赖于 PHP不解析符号链接(由于这个PHP 错误),这将不起作用。composer installmvwww__FILE__

于 2013-11-29T10:39:23.630 回答
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可能有更好的解决方案。但我更喜欢我的。

于 2014-05-19T01:57:00.690 回答
1

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

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

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

于 2016-09-23T22:43:05.743 回答
-1

关键是你的composer.lock文件。composer.lock 会准确跟踪您安装的软件包(和版本)。部署时,也将composer.lock文件发送到生产服务器,然后简单地执行一个composer update. 将安装所有完全相同的软件包版本。使用 Capistrano 或 Flightplan 等部署软件,您可以将composer update步骤作为流程的一部分,使其自动发生。

于 2014-09-08T22:38:05.740 回答