运行 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');
我们在 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 = 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');