Как настроить настраиваемые скрипты с помощью PHP-компилятора

Я хочу предоставить script, который можно установить с помощью диспетчера пакетов PHP composer, и это должно быть настраиваемо.

С композитором мы можем легко определить двоичные файлы поставщика.

Однако я не вижу возможности их конфигурировать.

Можно включить файл конфигурации из пакета. Однако имя и расположение каталога поставщика настраиваются, поэтому это будет не очень надежным.

Для сравнения: с помощью диспетчера пакетов Python pip мы можем использовать переменные среды для конфигурации. Мы можем установить переменные среды при активации виртуальной среды, например. используя инструменты, такие как virtualenvwrapper.

В сообществе PHP должны быть как минимум эксперименты с подобными подходами.

Добавление: история

У меня есть сценарии, которые синхронизируют базы данных и созданные пользователем файлы для тестовых версий веб-сайтов.

Для сайтов Django я всегда использую одни и те же скрипты, они полагаются на переменные среды, которые я определяю с помощью virtualenvwrapper.

Для сайтов Drupal можно многое достичь с помощью drush.

Но для Wordpress я не могу найти простой и чистый инструмент. Он должен

  • жить за пределами доступных для публики папок
  • можно установить с помощью композитора, в конечном итоге в сочетании с другими инструментами общего назначения-PHP
  • используйте простой и надежный способ определения настроек.

Честно говоря, я пропускаю virtualenvwrapper в PHP. Virtualenvwrapper - это linux script, который в основном выполняет две вещи:

  • Он активирует виртуальную среду Python. Переведенный на PHP, это означает, что все, что следует за ним, использует автозагрузчик определенного композиционного пакета.
  • Он запускает script при активации или деактивации виртуальной среды. Там есть возможность определять переменные среды и делать любые другие полезные вещи.

Ответ 1

Я не уверен, чего вы пытаетесь достичь, но есть много вариантов, если вы хотите использовать env vars в Php.

https://github.com/symfony/dotenv является одним из них и поддерживается в хорошем состоянии.

<?php
use Symfony\Component\Dotenv\Dotenv;

$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/path/to/.env');

Затем вы можете использовать эти env var так, как вы хотите, для целей настройки. Например. для конфигурации DB:

$someSettings = [
    // Db config
    DB_CONNECTION => [
        'host' => getenv('DB_HOST'),
        'username' => getenv('DB_USERNAME'),
        'password' => getenv('DB_PASSWORD'),
        'database' => getenv('DB_DATABASE')
    ]
];

Ответ 2

Вы можете добавить post-package-install script. С этим вы можете использовать что-то вроде symfony/console, чтобы позволить установщику выполнять какую-то конфигурацию.

Ответ 3

С композитором вы можете сделать что-то подобное (PATH - это переменная среды):

{
    "name": "test/test",
    "authors": [
        {
            "name": "Test",
            "email": "[email protected]"
        }
    ],
    "require": {

    },
    "scripts": {
        "post-install-cmd": [
            "@echoPath"
        ],
        "post-update-cmd": [
            "@echoPath"
        ],
        "echoPath": "echo $PATH"
    }
}

Не уверен, что это то, что вы хотите.

Ответ 4

Как и другие пользователи, я не уверен, что ваша конечная цель здесь, но то, что вы, похоже, наметили, похоже, нарушает точку использования композитора, вся суть композитора заключается в том, что код работает с любым приложением и требуемыми зависимостями получаются при установке.

Для того, что вы пытаетесь создать для настройки "настройки конфигурации", обычно реализуется путем настройки интерфейса конфигурации, который приложение, использующее приложение, должно создавать и обеспечивать инициализацию объектов класса/созданных объектов.

Например, для вашего композитора lib требуется система входа в систему, теперь вполне возможно, что приложение, в котором оно используется/установлено, уже имеет систему входа в систему. Ни один разработчик никогда не хочет иметь две разные таблицы входа для одного приложения в своей базе данных, поэтому вы должны создать интерфейс, который разработчик может реализовать и предоставить необходимую конфигурацию

Пример кода:

Пример класса, чтобы что-то сделать (класс ввода вашей библиотеки)

<?php
namespace my_namespace;

class DoSomething{
    private $config;

    public function __construct(\my_namespace\interface\Config $config)
    {
        $this->config = $config;
    }

    function doLogin()
    {
        // get $username and $password
        $state = $this->config->CheckUserLogin($username, $password);
        if(!is_bool($state)){ throw new Exception("State of CheckUserLogin from class '".get_class($this->config)."' is incorrect expected boolean but '".gettype($state)."' was provided"); }
    }

}

Пример интерфейса конфигурации: (интерфейс конфигурации библиотеки композитора)

<?php
namespace my_namespace\interface;

interface Config{

    public function CheckUserLogin($username, $password);

    //....

}

Это означает, что я могу установить вашу библиотеку через композитор и настроить так.

Пример моего приложения Config для вашей библиотеки: (класс, используемый приложением для создания наследования вашего интерфейса)

<?php
namespace myapp;

class DoSomethingConfig implementes \my_namespace\interface\Config{
    public function CheckUserLogin($username, $password)
    {
        // do my login system ($loginState)
        return $loginState;
    }
}

Пример моей инициализации вашей библиотеки: (код, который нужно использовать любому приложению)

<?php
namespace myapp;

class ConnectToSomething{
    private $lib;

    public function __construct(){
        $config = new \myapp\DoSomethingConfig();
        $this->lib = new \my_namespace\DoSomething($config);
    }

}

Таким образом, вы предоставляете свободное владение разработчикам для работы с вашей базой кода. в то время как они никогда не захотят редактировать ваши классы, потому что вы сделали что-то, что могло бы привести к дублированию информации.

Это простой пример, который подчеркивает ту цель, которую я пытаюсь сделать, не пытаясь запустить конфигурацию script, чтобы заставить пользователей настраивать материал для вашей библиотеки, чтобы они настроили материал, который был необходим в пути где они могут затем управлять этой точкой соединения между вашим кодом и есть, это также обеспечивает безопасность, поскольку они знают, что вы не получаете доступ к информации, которой не должны быть, и отправляйте ее на свои серверы.

Поскольку они предоставляют вашему коду доступ, который он требует для работы, и ничего больше.