Запустите php artisan с одной установки Laravel на другую

У нас есть веб-сайт развертывания Laravel, настроенный под deploy.mysite.com, который обрабатывает развертывания для множества других веб-сайтов.

Я пытаюсь развернуть еще один веб-сайт, который также является сайтом Laravel и находится в разделе site2.myothersite.com.

Оба находятся на одном сервере. Deploy вызывает сценарий на site2, этот сценарий развертывания запускает различные команды после cd перехода в каталог проекта. Мы используем следующее для обновления структуры базы данных.

php artisan migrate --force

Обычно, когда это запускается напрямую через SSH в корне проекта, все работает нормально.

Однако, когда это запускается через сценарий развертывания (используя php exec() для запуска этих команд), процесс действительно работает, однако вместо того, чтобы обновлять проект, в который мы cd вошли, он обновляет структуру базы данных развертывания. сайт!

Кажется, что команда php artisan migrate игнорирует тот факт, что я cd перешел в другой проект, и берет значения базы данных из текущего каталога.

Как я могу изменить это поведение?


person Novocaine    schedule 15.10.2018    source источник


Ответы (3)


Поиграв с несколькими различными решениями, я в конце концов понял, что проблема заключалась в том, что файл .env из проекта, в котором я находился, устанавливал переменные среды, а затем ничем не перезаписывался, поэтому, по сути, запускал код как неправильный сайт.

Что я сделал, чтобы решить эту проблему

В моем сценарии развертывания я вручную загрузил файл .env и перезаписал переменные среды на overload, а не просто на load. Примечание. Это будет работать только в версиях ниже V5.

$dotenv = Dotenv::create(__DIR__);
$dotenv->overload();

ОБНОВЛЕНИЕ для V5

Согласно комментарию @nibnut, поскольку dotenv V5 (теперь в Laravel 7.0) загружает переменные среды как неизменяемые. В моем случае я рад разрешить их изменение, и в этом случае я могу сделать следующее вместо того, что указано выше.

$dotenv = Dotenv::createMutable(__DIR__);
$dotenv->load();

https://github.com/vlucas/phpdotenv#immutability-and-repository-customization

Это все, что мне нужно было сделать, чтобы мой первоначальный сценарий заработал.

ПРИМЕЧАНИЕ. поскольку это установка laravel со всех сторон, пакет dotenv был уже установлен. Это можно использовать для любого проекта, установив его отдельно.

person Novocaine    schedule 19.10.2018

Вместо cd в каталог вы можете изменить команду на что-то похожее на это:

php /var/www/sitea/artisan migrate --force

Это запустит команду artisan для указанного каталога.

person George Hanson    schedule 15.10.2018
comment
Это то, что я действительно пробовал - я также дважды проверил это только что, к сожалению, я получил тот же результат. Сначала я стер базу данных, и вместо создания таблиц она не удалась, сообщив мне, что таблица пользователей уже существует (что она и делает на сайте развертывания), поэтому даже запуск команды, как указано выше, все еще пытается запустить ее на другом установить. - person Novocaine; 15.10.2018
comment
Вы проверили, что файл .env на сайте содержит правильные учетные данные базы данных? - person George Hanson; 15.10.2018

Ответ новокаина, к сожалению, больше не работает в Laravel 7.x, поскольку файл DotEnv загружается неизменным.

Мой текущий обходной путь — создать временный файл .env в моем проекте (т. е. .env.temp), а затем использовать аргумент --env при вызове моих ремесленных команд:

php artisan migrate --env=temp

Это может работать не во всех случаях использования, но если вы вызываете команды ремесленника в проекте B из проекта A, это должно работать нормально.

person nibnut    schedule 03.08.2020
comment
Я еще не запускал это с установкой 7.x, но это похоже на хорошее решение ???? - person Novocaine; 03.08.2020
comment
Теперь я столкнулся с этой проблемой и обновил свой ответ. Инициализация как изменяемая также может работать, ЕСЛИ это нормально для вашей среды - $dotenv = Dotenv::createMutable(__DIR__); $dotenv->load(); - person Novocaine; 06.08.2020
comment
Да, опция createMutable тоже работает очень хорошо — спасибо за это! - person nibnut; 12.08.2020