typisttech/imposter

将所有 composer 供应商包包装在您的命名空间内。适用于 WordPress 插件。

0.6.1 2020-12-06 22:57 UTC

README

Imposter

Packagist Version Packagist Downloads PHP from Packagist CircleCI Codecov License Twitter Follow @TangRufus Hire Typist Tech

将所有 composer 供应商包包装在您的命名空间内。适用于 WordPress 插件。

Typist Tech 倾心打造

Imposter 是一个开源项目,并且完全免费使用。

然而,没有适当的财务支持,维持和发展新功能所需的工作量是不可持续的。如果您有能力,请考虑通过以下链接进行捐赠

GitHub via Sponsor Sponsor via PayPal More Sponsorship Information

将所有 composer 供应商包包装在您的命名空间内。适用于 WordPress 插件。

为什么?

由于 WordPress 中缺乏依赖管理,如果两个插件捆绑了同一包的冲突版本,就会产生难以重现的错误。对 composer 供应商包进行猴子补丁,将它们包装在您的命名空间内,是避免此类冲突的次优解决方案。

安装

如果您想将 Imposter 集成到 composer 命令事件 中,请安装 Imposter 插件。见:如何将 Imposter 集成到 composer 中?

应通过 composer 进行安装,有关如何安装 composer 的详细信息,请参阅 https://getcomposer.org.cn/

composer require typisttech/imposter

配置

在您的 composer.json

"extra": {
    "imposter": {
        "namespace": "My\\App\\Vendor",
        "excludes": [
            "dummy/dummy-excluded"
        ]
    }
}

extra.imposter.namespace

必需 字符串

这是要添加到供应商包的命名空间前缀。

extra.imposter.excludes

可选 字符串数组

需要排除从命名空间前缀中的供应商包。默认情况下,所有 由 composer 创建的包 都被排除。此外,所有在 Composer 命名空间下的内容也将被排除。

用法

每次 $ composer install$ composer update

<?php

use TypistTech\Imposter\ImposterFactory;

$imposter = ImposterFactory::forProject('/path/to/project/root');
$imposter->run();

上述代码片段

  1. 查找 /path/to/project/root/composer.json
  2. 查找 vendor-dir
  3. 找出所有 必需的包,包括依赖项所需的包
  4. 找出所有必需包的所有 自动加载路径
  5. 使用在您的 composer.json 中定义的 imposter 命名空间前缀对所有命名空间进行前缀

之前

<?php

namespace Dummy\File;

use AnotherDummy\{
    SubAnotherDummy, SubOtherDummy
};
use Composer;
use Composer\Plugin\PluginInterface;
use Dummy\SubOtherDummy;
use OtherDummy\SubOtherDummy;
use RuntimeException;
use \UnexpectedValueException;
use function OtherVendor\myFunc;
use const OtherVendor\MY_MAGIC_NUMBER;

$closure = function () use ($aaa) {
    // Just testing.
};

class DummyClass
{
    public function useClosure()
    {
        array_map(function () use ($xxx) {
            // Just testing.
        }, []);
    }
}

function dummyFunction(string $namespace = null, string $use = null): array
{
    if (! is_null($namespace) && $namespace === 'dummy string' && $use === 'dummy string') {
        // Just testing.
    }

    return [];
}

foreach ([] as $namespace => $prefix) {
    $aaaa = '{' . $namespace . '}' . $prefix;
}

/** Just a comment for testing $namespace transformation */

之后

<?php

namespace MyPlugin\Vendor\Dummy\File;

use MyPlugin\Vendor\AnotherDummy\{
    SubAnotherDummy, SubOtherDummy
};
use Composer;
use Composer\Plugin\PluginInterface;
use MyPlugin\Vendor\Dummy\SubOtherDummy;
use MyPlugin\Vendor\OtherDummy\SubOtherDummy;
use RuntimeException;
use \UnexpectedValueException;
use function MyPlugin\Vendor\OtherVendor\myFunc;
use const MyPlugin\Vendor\OtherVendor\MY_MAGIC_NUMBER;

$closure = function () use ($aaa) {
    // Just testing.
};

class DummyClass
{
    public function useClosure()
    {
        array_map(function () use ($xxx) {
            // Just testing.
        }, []);
    }
}

function dummyFunction(string $namespace = null, string $use = null): array
{
    if (! is_null($namespace) && $namespace === 'dummy string' && $use === 'dummy string') {
        // Just testing.
    }

    return [];
}

foreach ([] as $namespace => $prefix) {
    $aaaa = '{' . $namespace . '}' . $prefix;
}

/** Just a comment for testing $namespace transformation */

Typist Tech 准备构建您下一个令人惊叹的 WordPress 网站。 雇佣我们!

已知问题

需要帮助。 欢迎提交拉取请求。

  1. 特性未转换
  2. 不支持虚拟包

常见问题解答

如何将 imposter 集成到 composer 中?

使用 Imposter 插件。它将 imposter 集成到 composer 命令事件 中。

imposter 是否支持 PSR4PSR0ClassmapFiles

是的,所有都支持。PSR-4 和 PSR-0 自动加载,类映射生成和文件包含都受到支持。

我是否可以排除一些包以供 imposter 使用?

是的,请参见 extra.imposter.excludes。默认情况下,所有由 composer 创建的包都被排除。

那么 require-dev 包怎么办呢?

Imposter 在 require-dev 包上不做任何操作,因为 imposter 的目的是避免生产环境,而不是开发环境。

PHP 内置类怎么办?

Imposter 会跳过全局命名空间中的类,例如:\ArrayObject\RuntimeException

那么不使用命名空间的包怎么办?

目前还不支持。请通过 创建一个 issue 告诉我您的想法。

使用完全限定名的包怎么办?

目前还不支持。我们需要在 Transformer 类中有一个更好的正则表达式(或比正则表达式更好的东西)。请通过 创建一个 issue 告诉我您的想法。

整个 imposter 的情况很糟糕。我们能做什么呢?

在 WordPress 核心提供关于依赖管理的解决方案之前,请保持冷静并继续前进。

与此同时,请查看这些工具 以使 WordPress 更好 现代化 WordPress 开发

支持哪些 composer 版本?

支持 v1 和 v2。

您会添加对旧 PHP 版本的支持吗?

永远不会!此插件仅适用于 积极支持的 PHP 版本

不要在 已停产 或仅提供 安全修复 的 PHP 版本上使用它。

看起来很棒。我能在哪里找到更多这样的好东西?

我可以在哪里给出 5 星级的评论?

谢谢!很高兴你喜欢它。让我知道有人在使用这个项目是很重要的。请考虑

测试

composer test
composer style:check

替代方案

以下是我找到的替代方案列表。然而,这些方案都不满足我的要求。

如果您知道其他类似的项目,请随时编辑本节!

  • Mozart by Coen Jacobs

    • 支持 PSR0 和 PSR4
    • 依赖包存储在不同的目录中
  • PHP Scoper

    • 为文件/目录中的所有 PHP 命名空间添加前缀,以隔离打包在 PHAR 中的代码

反馈

请提供反馈! 我们希望使这个项目尽可能有用。请提交问题并指出您喜欢和不喜欢的功能,或者克隆项目并发送拉取请求没有问题太小。

安全漏洞

如果您在此项目中发现安全漏洞,请通过电子邮件发送给我们 imposter@typist.tech。所有安全漏洞都将得到及时处理。

鸣谢

Imposter 是一个 Typist Tech 项目,由 Tang Rufus 维护,他是 招聘 的自由职业开发者。

完整的贡献者列表可以在这里找到。

许可证

Imposter 使用MIT许可证发布。