Подтвердить что ты не робот

Развертывание репозитория и композитор: какой рабочий процесс?

Как разработчик PHP, я очень много работаю с Composer. Раньше это было в личных проектах, поэтому у меня не было много проблем с этим, но теперь с Laravel 4 это на проекте, который требует развертывания, и я вхожу в борьбу за адаптацию моего рабочего процесса.

Все мои проекты являются репозиториями git, поэтому для каждого соглашения и потому, что он по-прежнему довольно глючит, как и большинство разработчиков, я помещаю каталог vendor в свой .gitignore. Теперь проблема заключается в следующем: я также использую git для развертывания на сервере, и по всей логике каталог поставщика не загружается, поскольку он не отслеживается репозиторием.

Итак, мой вопрос касается людей, которые работали с Composer и git дольше меня: какой лучший рабочий процесс поддерживает синхронизация сервера? Как отслеживать папку поставщика, не отслеживая ее? Я пытался загружать его каждый раз, когда я обновляю Composer, но некоторые из моих папок поставщика довольно большие, и я не могу вручную загружать 30Mb файлов каждый раз, когда что-то обновляется.

Я действительно не знаю, как вы, ребята, справляетесь с этим? Я пробовал не игнорировать папку vendor, но git просто испортил ее, половина была признана клонированными репозиториями и в любом случае просто игнорируется и т.д.

UPDATE: обратите внимание, что я на общем хосте, поэтому у меня нет доступа к серверному терминалу.

4b9b3361

Ответ 1

Лучший способ - запустить composer install на сервере после обновления до последнего кода. Вы также должны убедиться, что вы передали свой файл composer.lock, который затем будет использоваться сервером для установки (вы не должны запускать composer update на сервере).

Ответ 2

Capistrano (или Capifony, если вы используете Symfony2) очень полезен для развертывания с композитором. Вы можете запускать развертывание удаленно, и он будет запускать установку композитора отдельно, чтобы сайт оставался в сети до тех пор, пока он не будет успешно развернут. Есть много других преимуществ, таких как сохранение предыдущих развертываний и откат, копирование старых поставщиков перед развертыванием, сбор активов и т.д. И т.д.

Ответ 3

Я работаю над чем-то вроде этого в 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

В идеале все развертывание (т.е. в этом случае git checkout и composer install), за исключением одного единственного mv, будет происходить изолированно, за пределами www. Это не сработает, если у вас есть необработанные файлы (например, загрузка CMS) в рабочем дереве и полагайтесь на PHP __FILE__, не разрешая символические ссылки (из-за этого PHP-ошибка).

Ответ 4

Это старый вопрос, но если кто-то ищет решение:

Я немного изменяю ответ @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. Но мне нравится моя лучше.

Ответ 5

Вы можете использовать что-то вроде jenkins для ftp файлов таким образом, чтобы вы могли направить jenkins для запуска установки композитора на сервере jenkins, а затем ftp файлы.

Это также позволяет игнорировать папку поставщика.

Для этого требуется создание сервера сборки, и вам нужно будет выполнять команды против сервера сборки

Ответ 6

Ключ - это ваш composer.lock файл. Композитор .lock отслеживает, какие именно пакеты (и версии) вы установили. При развертывании отправьте файл composer.lock на рабочий сервер и просто выполните composer update. Будут установлены все те же самые версии пакетов. С помощью программного обеспечения для развертывания, такого как Capistrano или Flightplan, вы можете сделать шаговую часть composer update, чтобы она выполнялась автоматически.