运行 php artisan 从一个 Laravel 安装到另一个

Run php artisan from one Laravel install to another

我们在 deploy.mysite.com 下设置了一个 Laravel 部署网站,它处理许多其他网站的部署。

我正在尝试部署的另一个网站也是 Laravel 站点,位于 site2.myothersite.com.

两者都在同一台服务器上。 Deploy 在 site2 上调用一个脚本,这个 deploy 脚本 运行 在 cd'ing 到项目目录后的各种命令。我们使用以下更新数据库结构。

php artisan migrate --force

通常当这是在项目根目录下直接通过 SSH 运行 时,运行 就可以了。

然而,当这是 运行 通过部署脚本(使用 php exec() 到 运行 这些命令)时,该过程确实有效 - 但是,它不会更新我们 cd 进入的项目,而是更新部署站点的数据库结构!

似乎 php artisan migrate 命令忽略了我已经 cd 进入另一个项目的事实,它从当前目录中获取数据库值。

我该如何改变这种行为?

而不是 cd 到目录,您可以将命令更改为与此类似的内容:

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

这将 运行 所提供目录的 artisan 命令。

$log = shell_exec("unset DB_HOST &&
       unset DB_PORT && 
       unset DB_PASSWORD && 
       unset DB_USERNAME && 
       unset DB_DATABASE && 
       composer dump-autoload &&
       cd /var/www/yourproject/ && php /var/www/yourproject/artisan migrate:fresh &&
       php /var/www/yourproject/artisan db:seed &&
       php /var/www/yourproject/artisan seed:translation");

在尝试了多种不同的解决方案后,我最终意识到问题出在我所在项目的 .env 文件正在设置环境变量,然后没有被任何东西覆盖,因此当时基本上 运行 代码是错误的站点。

我做了什么来解决这个问题

在我的部署脚本中,我手动加载了 .env 文件并用 overload 而不仅仅是 load 覆盖了环境变量。 注意:这仅适用于 V5 以下的版本。

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

更新 V5

根据 ,因为 dotenv V5(现在在 Laravel 7.0 中)这会将环境变量加载为不可变的。在我的例子中,我很高兴允许这些是可变的,在这种情况下我可以执行以下而不是上面的操作。

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

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

这就是让我的原始脚本正常工作所要做的一切。

注意: 因为这是一个 laravel 安装,所以 dotenv 软件包已经安装。这可以通过单独安装用于任何项目。

不幸的是,novocaine 的回答在 Laravel 7.x 中不再有效,因为 DotEnv 文件加载时不可变。

我当前的解决方法是在我的项目中创建一个临时 .env 文件(即“.env.temp”),然后在调用我的 artisan 命令时使用 --env 参数:

php artisan migrate --env=temp

这可能不适用于所有用例,但如果您从项目 A 中调用项目 B 中的 artisan 命令,它应该可以正常工作。

novocaine 的回答涉及重新加载 .env 文件。但您也可以使用 env -i.

清空环境变量

此方法将避免由于.env文件变量名不同而导致某些变量未被覆盖。例如,您的部署站点可能在 .env 中有一个名为 DEPLOY_KEY 的变量,但在站点 2 的 .env 中不存在。重新加载 .env 文件可能会使 DEPLOY_KEY 变量在 site2 脚本中可用。这可能会导致安全问题。

所以,而不是 运行

exec('php artisan migrate --force');

您只需添加 env -i:

exec('env -i php artisan migrate --force');

来源:https://unix.stackexchange.com/a/48995/375005