当部署脚本尝试安装资产时,我出现此错误:
(安装PHP 7.2,Symfony 4.4)
[Symfony\Component\Process\Exception\ProcessFailedException]
The command "ssh -A root@vps.net -p 21 '(export APP_ENV=prod; cd /var/www-deploy/site.com/releases/20191129224025
&& php /var/www-deploy/site.com/releases/20191129224025/bin/console assets:install /var/www-deploy/site.com/releases/20191129224025/public --symlink --no-debug --env=prod)'" failed.
Exit Code: 1(General error)
Working directory: /Users/coil/Sites/site.com
Output:
================
Error Output:
================
In EnvVarProcessor.php line 162:
Environment variable not found: "APP_SERVER".
我已将.env文件放入共享文件中,因此在创建发行目录时将其复制,该文件位于目录中。
public function configure(): DefaultConfiguration
{
return $this->getConfigBuilder()
// ...
->sharedFilesAndDirs(['.env'])
// ...
}
我还尝试将环境变量放入部署用户的.bashrc
文件中
printenv | grep -i app
APP_DEBUG=0
APP_SECRET=whatever
APP_ENV=prod
APP_SERVER=prod
所以,我不明白为什么仍找不到环境变量。以及为什么不从.env
文件中提取它们。
如果我中断了部署,并且在服务器上手动运行了相同的命令,则效果很好。谢谢。
[编辑2019-11-30] 我想我知道,运行命令时,会完成APP_ENV的导出。并且,如果应用程序检测到该env变量,它将跳过.env file
。因此,我需要避免设置此env var,否则必须设置全部而不是仅设置这个。
答案 0 :(得分:2)
它现在可以在src/Configuration/DefaultConfiguration.php
中进行以下修改:
} elseif (4 === $symfonyMajorVersion || (3 === $symfonyMajorVersion && 4 >= $symfonyMinorVersion)) {
$this->_symfonyEnvironmentEnvVarName = 'APP_ENV';
我已经将一个未知的env变量传递给Symfony:
$this->_symfonyEnvironmentEnvVarName = 'APP_FAKE_ENV';
因此.env
文件不再被忽略。我认为根据应用程序的设置,缺少设置此环境变量的选项。我会尝试对捆绑包进行公关。
因此,由于尚未修改包,因此我修改了private属性,以使命令使用我的.env
文件而不是环境变量:
/**
* @see https://stackoverflow.com/q/1762135/633864
*/
private function forceEnvironmentEnvVarName(DefaultConfiguration $configuration): DefaultConfiguration
{
$myClassReflection = new ReflectionClass(get_class($configuration));
$symfonyEnvironmentEnvVarName = $myClassReflection->getProperty('_symfonyEnvironmentEnvVarName');
$symfonyEnvironmentEnvVarName->setAccessible(true);
$symfonyEnvironmentEnvVarName->setValue($configuration, 'FAKE_APP_ENV');
$symfonyEnvironmentEnvVarName->setAccessible(false);
return $configuration;
}