Как настроить настраиваемые скрипты с помощью 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, чтобы заставить пользователей настраивать материал для вашей библиотеки, чтобы они настроили материал, который был необходим в пути где они могут затем управлять этой точкой соединения между вашим кодом и есть, это также обеспечивает безопасность, поскольку они знают, что вы не получаете доступ к информации, которой не должны быть, и отправляйте ее на свои серверы.
Поскольку они предоставляют вашему коду доступ, который он требует для работы, и ничего больше.