Как в 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']]);

    }
});
Другие вопросы по тегам