Как в php deployer установить информацию о хосте из.env вместо ~/.ssh/config
Я смотрю, как я могу настроить хост-пользователя и перейти от env
это не работает - нужна строка, а не функция
host('51.38.98.87')
->stage('production')
->user( function(){return getenv('PRODUCTION_USER'); )
->pass( function(){return getenv('PRODUCTION_PASS'); )
->port(22)
в Symfony 4 я использую env и не хочу устанавливать хосты в ~/.ssh/config
Обновление 1:
<?php
namespace Deployer;
use Symfony\Component\Dotenv\Dotenv;
require 'recipe/symfony.php';
require_once 'vendor/autoload.php';
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/.env');
затем
развернуть производство
получить
dep deploy production
[Error] Class 'Symfony\Component\Dotenv\Dotenv' not found
#0 phar:///usr/local/bin/dep/src/Deployer.php(325): require()
#1 [internal function]: Deployer\Deployer::Deployer\{closure}()
#2 phar:///usr/local/bin/dep/src/Deployer.php(326): call_user_func(Object(Closure))
#3 phar:///usr/local/bin/dep/bin/dep(119): Deployer\Deployer::run('6.3.0',
Обновление 2
composer.json имеет symfony/dotenv
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.0",
"symfony/browser-kit": "^4.0",
"symfony/css-selector": "^4.0",
"symfony/debug-pack": "*",
"symfony/dotenv": "^4.0",
"symfony/maker-bundle": "^1.0",
"symfony/phpunit-bridge": "^4.0",
"symfony/profiler-pack": "*",
"symfony/web-server-bundle": "^4.0"
},
но до сих пор
namespace Deployer;
use Symfony\Component\Dotenv\Dotenv;
require 'vendor/autoload.php';
require 'recipe/symfony.php';
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/.env');
дай мой
Class 'Symfony\Component\Dotenv\Dotenv' not found
#0 phar:///usr/local/bin/dep/src/Deployer.php(325): require()
#1 [internal function]: Deployer\Deployer::Deployer\{closure}()
#2 phar:///usr/local/bin/dep/src/Deployer.php(326): call_user_func(Object(Closure))
#3 phar:///usr/local/bin/dep/bin/dep(119): Deployer\Deployer::run('6.3.0', '/home/grek/Phps...')
#4 /usr/local/bin/dep(4): require('phar:///usr/loc...')
#5 {main}
ОБНОВЛЕНИЕ 3
Я создаю тестовый файл:./test.php
<?php
use Symfony\Component\Dotenv\Dotenv;
require 'vendor/autoload.php';
(new Dotenv())->load(__DIR__.'/.env');
php test.php работает отлично.
Запустите из того же места развертывание развертывания: подготовка
дай мой
[Error] Class 'Symfony\Component\Dotenv\Dotenv' not found
#0 phar:///usr/local/bin/dep/src/Deployer.php(325): require()
мой файл deploy.php
<?php
namespace Deployer;
use Symfony\Component\Dotenv\Dotenv;
require 'vendor/autoload.php';
require 'recipe/symfony.php';
(new Dotenv())->load(__DIR__.'/.env');
Deployer установлен глобально
whereis dep
dep: /usr/local/bin/dep
1 ответ
Вы пытались включить symfony/dotenv в своем файле deploy.php?
require_once 'vendor/autoload.php';
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/.env');
Сначала вам нужно установить компонент dotenv:
composer require --dev symfony/dotenv
Удалить --dev
вариант, если вы используете его в среде только с производственными зависимостями.
Я использую файлы.env для создания файлов настроек, и способ, которым я это обошел, заключался в том, чтобы добавить свойство к хосту, которое указывает файлы.env и шаблона:
# hosts.yml
hostname:
...
env_file: .env.stage
settings_template: somewhere/file.template
# file.template
...
'database' => '{{DB_NAME}}',
...
Загрузите учетные данные с помощью функции:
# deploy.php
// Loading of .env files
// add Symfony's dotenv as a requirement: composer global require symfony/dotenv:"^3"
function loadenv() {
$env_file = get('env_file');
$environment = file_get_contents($env_file);
$dotenv = new \Symfony\Component\Dotenv\Dotenv();
$data = $dotenv->parse($environment);
return $data;
};
Наконец, создайте задачу, которая вызывает loadenv()
функция, записывает учетные данные в файл и загружает его на сервер:
task('upload:settings', function () {
if (askConfirmation('Are you sure to generate and upload the settings?')) {
//Get template
$template = get('settings_template');
//Import secrets
$secrets = loadenv();
//Prepare replacement variables
$iterator = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($secrets)
);
$replacements = [];
foreach ($iterator as $key => $value) {
$keys = [];
for ($i = $iterator->getDepth(); $i > 0; $i --) {
$keys[] = $iterator->getSubIterator($i - 1)->key();
}
$keys[] = $key;
$replacements['{{' . implode('.', $keys) . '}}'] = $value;
}
//Create settings from template
$settings = file_get_contents($template);
$settings = strtr($settings, $replacements);
$tmpFilename = 'settings.tmp';
file_put_contents($tmpFilename, $settings);
upload($tmpFilename, '{{release_path}}/somewhere', ['options'=> ['--inplace']]);
}
});