如何使用PHP composer提供可配置脚本
我想提供一个脚本,它可以与PHP的PackageManager如何使用PHP composer提供可配置脚本,php,configuration,composer-php,Php,Configuration,Composer Php,我想提供一个脚本,它可以与PHP的PackageManagercomposer一起安装,并且必须是可配置的 使用composer,我们可以轻松定义 但是,我看不到配置它们的任何可能性 可以在包中包含一个配置文件。然而,供应商目录的名称和位置是可配置的,所以这不是很可靠 比较:使用Python的包管理器pip,我们可以使用环境变量进行配置。我们可以在激活虚拟环境时设置环境变量,例如,使用virtualenvwrapper等工具 PHP社区中必须至少有类似方法的实验 附录:背后的故事 我有脚本同步数
composer一起安装,并且必须是可配置的
使用composer,我们可以轻松定义
但是,我看不到配置它们的任何可能性
可以在包中包含一个配置文件。然而,供应商目录的名称和位置是可配置的,所以这不是很可靠
比较:使用Python的包管理器pip
,我们可以使用环境变量进行配置。我们可以在激活虚拟环境时设置环境变量,例如,使用virtualenvwrapper
等工具
PHP社区中必须至少有类似方法的实验
附录:背后的故事
我有脚本同步数据库和用户生成的文件,用于网站的测试版本
对于Django站点,我总是使用相同的脚本,它们依赖于我用VirtualNVRapper定义的环境变量
对于Drupal站点,使用drush可以实现很多功能
但是对于Wordpress,我找不到一个简单而干净的工具。它应该
- 在可供公众使用的文件夹之外活动
- 可与composer一起安装,最终可与其他通用PHP工具结合使用
- 使用简单而可靠的方法检测设置
老实说,我错过了PHP中的虚拟说唱歌手。
VirtualEnvrapper是一个linux脚本,它基本上完成两件事:
它激活Python虚拟环境。翻译成PHP意味着接下来的所有内容都使用某个composer包的自动加载程序
它在激活或停用virtualenvironment时执行脚本。在这里,我们可以定义环境变量并做其他有用的事情
我不确定您想要实现什么,但是如果您想在Php中使用env vars,有很多选择
是其中之一,维护良好
<?php
use Symfony\Component\Dotenv\Dotenv;
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/path/to/.env');
作为其他用户,我不确定您的最终目标是什么,但您似乎概述的内容似乎打破了使用composer的界限。composer的全部要点是,代码可以与任何应用程序一起工作,并且在安装时获得所需的依赖项
对于您试图为“配置设置”创建设置的操作,通常通过设置一个配置接口来实现,使用应用程序必须创建该接口,并为您的类/创建的对象提供初始化
例如,您的composer lib现在需要一个登录系统,它很可能是正在使用/安装的应用程序,已经有了一个登录系统。没有开发人员希望在他们的数据库中为单个应用程序创建两个不同的登录表,所以您应该创建一个开发人员应用程序可以实现的界面,并提供所需的配置
代码示例:
示例类执行某些操作(您的library entry类)
您可以添加脚本。有了它,您可以使用symfony/console之类的工具来允许安装程序进行某种配置。使用编写器,您可以执行类似的操作(PATH是您的环境变量):
不确定这是否是你想要的。我想,你要找的可能是像图书馆一样的东西
它是一个非常流行的库,也由Yii/2框架的创建者/贡献者管理
或者资产包的创建者hiqdev
此Composer插件提供与Composer软件包一起分发的配置的组装。它允许将使用包所需的配置放在包的内部,从而实现插件系统。该软件包将成为一个插件,包含代码及其配置。
用法:
"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"
}
},
通常PHP库不尝试直接加载配置,而是在实例化类时获取配置参数。我不太确定我是否遵循了您在这里试图实现的目标。这个脚本是用来干什么的?您是否使用不同的版本,并希望为特定案例提供特定版本?您是否想过使用Symfony控制台
而不是脚本?您可以在执行控制台命令时轻松地传递参数,这些命令可以触发不同的行为。我认为您试图打破composer的观点,关键是,你的代码是经过设置的,因此使用你的库的用户应用程序可以配置它,因此你应该设置一个配置系统。大多数人通过创建一个接口来实现这一点,该接口在obj初始化时被扩展并传递给你的类。我在我的问题中添加了一些文本,解释了背后的动机。我将.env
我的项目根文件夹中的文件。在可安装脚本中,我将在所有父文件夹中搜索.env
文件,并使用我能找到的第一个文件。
<?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);
//....
}
<?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);
}
}
{
"name": "test/test",
"authors": [
{
"name": "Test",
"email": "test@email.com"
}
],
"require": {
},
"scripts": {
"post-install-cmd": [
"@echoPath"
],
"post-update-cmd": [
"@echoPath"
],
"echoPath": "echo $PATH"
}
}
"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"
}
},