我想提供一个可以与PHP的包管理器composer
一起安装的脚本,并且必须是可配置的。
使用作曲家,我们可以轻松定义供应商二进制文件。
但是,我认为没有任何配置它们的可能性。
可以包含包中的配置文件。但是,供应商目录的名称和位置是可配置的,因此这不是很可靠。
为了比较:使用 Python 的包管理器pip
,我们可以使用环境变量进行配置。我们可以在激活虚拟环境时设置环境变量,例如通过使用virtualenvwrapper
等工具。
在PHP社区中至少必须有类似方法的实验。
附录:背后的故事
我有脚本可以同步数据库和用户生成的文件,用于网站的测试版本。
对于Django站点,我总是使用相同的脚本,它们依赖于我使用 virtualenvwrapper 定义的环境变量。
对于Drupal站点,可以使用drush实现很多目标。
但是对于Wordpress,我找不到一个简单干净的工具。它应该
- 住在公众可用的文件夹之外
- 可与 composer 一起安装,最终与其他通用 PHP 工具结合使用
- 使用简单而可靠的方法来检测设置。
老实说,我错过了PHP中的虚拟包装器。 virtualenvwrapper是一个Linux脚本,基本上做两件事:
- 它激活了一个Python虚拟环境。翻译成PHP,这意味着下面的所有内容都使用某个作曲家包的自动加载器。
- 它在激活或停用虚拟环境时执行脚本。在那里,人们可以定义环境变量并做任何其他有用的事情。
我不确定你想实现什么,但如果你想在 Php 中使用 env vars,有很多选择。
https://github.com/symfony/dotenv 就是其中之一,维护得很好。
<?php
use SymfonyComponentDotenvDotenv;
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/path/to/.env');
然后,您可以按照所需的方式使用这些 env var 进行配置。 例如,对于数据库配置:
$someSettings = [
// Db config
DB_CONNECTION => [
'host' => getenv('DB_HOST'),
'username' => getenv('DB_USERNAME'),
'password' => getenv('DB_PASSWORD'),
'database' => getenv('DB_DATABASE')
]
];
您可以添加软件包安装后脚本。 有了它,您可以使用类似symfony/console的东西来允许安装程序进行某种配置。
对于作曲家,你可以做这样的事情(PATH 是你的环境变量):
{
"name": "test/test",
"authors": [
{
"name": "Test",
"email": "test@email.com"
}
],
"require": {
},
"scripts": {
"post-install-cmd": [
"@echoPath"
],
"post-update-cmd": [
"@echoPath"
],
"echoPath": "echo $PATH"
}
}
不确定这是否是您想要的。
作为其他用户,我不确定您的最终目标是什么,但您似乎已经概述的内容似乎打破了使用作曲家的重点作曲家的全部意义在于代码适用于任何应用程序,并且在安装时获得所需的依赖项。
对于您尝试为"配置设置"创建设置的操作通常是通过设置一个配置接口来实现的,使用应用程序必须创建该接口并为您的类/创建的对象提供初始化。
例如,您的作曲家库需要一个登录系统,现在它很可能是正在使用/安装的应用程序已经有一个登录系统。任何开发人员都不希望其数据库中的单个应用程序有两个不同的登录表,因此您应该创建一个开发人员应用程序可以实现的接口并提供所需的配置
代码示例:
用于执行某些操作的示例类(您的库条目类)
<?php
namespace my_namespace;
class DoSomething{
private $config;
public function __construct(my_namespaceinterfaceConfig $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_namespaceinterface;
interface Config{
public function CheckUserLogin($username, $password);
//....
}
这意味着我可以通过作曲家安装您的库并像这样设置。
示例我的应用程序 库的配置:(使用应用程序必须构建的继承接口的类)
<?php
namespace myapp;
class DoSomethingConfig implementes my_namespaceinterfaceConfig{
public function CheckUserLogin($username, $password)
{
// do my login system ($loginState)
return $loginState;
}
}
示例我初始化您的库:(任何应用程序都必须使用的代码)
<?php
namespace myapp;
class ConnectToSomething{
private $lib;
public function __construct(){
$config = new myappDoSomethingConfig();
$this->lib = new my_namespaceDoSomething($config);
}
}
通过这种方式,您可以让开发人员自由地使用您的代码库。 虽然他们永远不应该想要编辑您的类,因为您做了一些会导致重复信息的事情。
这是一个简单的例子,突出了我试图表达的观点不要尝试运行配置脚本来让用户为您的库设置内容,让他们以一种他们可以管理您的代码和那里之间的连接点的方式设置所需的内容,这也提供了安全性,因为他们知道您不访问您不应该访问的信息并将其发送到您的服务器。
因为它们为您的代码提供了工作所需的访问权限,仅此而已。
我想,你在寻找的东西可能是一个图书馆 https://packagist.org/packages/hiqdev/composer-config-plugin
这是一个非常受欢迎的库,也由 Yii/2 框架 Samdark https://packagist.org/users/samdark/的创建者/贡献者管理。 或资产包装主义者希克德夫的创造者 https://packagist.org/users/hiqdev/
This Composer plugin provides assembling of configurations distributed with composer packages. It allows putting configuration needed to use a package right inside of the package thus implementing a plugin system. The package becomes a plugin holding both the code and its configuration.
用法:
"extra": {
"config-plugin-output-dir": "path/relative-to-composer-json",
"config-plugin": {
"params": [
"config/params.php",
"?config/params-local.php"
],
"common": "config/common.php",
"web": [
"$common",
"config/web.php"
],
"other": "config/other.php"
}
},