nanbando/

embedded-composer

将 Composer 集成到其他应用中

1.0.0 2021-06-23 07:02 UTC

This package is auto-updated.

Last update: 2024-09-23 14:23:42 UTC


README

Composer 集成到其他应用中。

安装

通过 Composer 作为 dflydev/embedded-composer

为什么我想集成 Composer 呢?

想象一下一个作为 phar 分发的控制台应用程序。如果希望应用程序能够根据所在的目录进行扩展(比如在一个目录中使用一组插件,而在另一个目录中使用另一组完全不同的插件)时,不能简单地同时在两个目录中定义一个 composer.json 并运行 composer install

为什么不呢?因为应用程序附带了一套特定的依赖。Composer 无法添加更多依赖,以免引入冲突。解决方案是将 Composer 集成到应用程序中,这样 Composer 就可以合并应用程序已安装的依赖项与特定目录 composer.json 中定义的依赖项。

最终结果是满足目录特定需求的一组依赖项,同时考虑了控制台应用程序已安装的依赖项。

虽然这对于分发的 phar 应用程序是必需的,但这种技术可以应用于任何需要运行时扩展的全局安装的应用程序。

使用方法

基础

以下是一个示例 bin/myapp 风格的脚本,可以用于通过 Composer 安装(vendor/bin/myapp)或全局安装(/usr/local/bin/myapp)。

myapp.php (bin)

用于从应用程序初始化嵌入式 Composer 的共享代码块。

<?php
// assume $classLoader is somehow defined prior to this block of
// code and contains the Composer class loader from the command
//
// see next two blocks of code

use Dflydev\EmbeddedComposer\Core\EmbeddedComposerBuilder;
use Symfony\Component\Console\Input\ArgvInput;

$input = new ArgvInput;

$projectDir = $input->getParameterOption('--project-dir') ?: '.';

$embeddedComposerBuilder = new EmbeddedComposerBuilder(
    $classLoader,
    $projectDir
);

$embeddedComposer = $embeddedComposerBuilder
    ->setComposerFilename('myapp.json')
    ->setVendorDirectory('.myapp')
    ->build();

$embeddedComposer->processAdditionalAutoloads();

// application is now ready to be run taking both the embedded
// dependencies and directory specific dependencies into account.

myapp (bin)

示例 bin 脚本(bin/myapp),在找到正确的自动加载器后需要共享代码块。

#!/usr/bin/env php
<?php

if (
    // Check where autoload would be if this is myapp included
    // as a dependency.
    (!$classLoader = @include __DIR__.'/../../../autoload.php') and

    // Check where autoload would be if this is a development version
    // of myapp. (based on actual file)
    (!$classLoader = @include __DIR__.'/../vendor/autoload.php')
) {
    die('You must set up the project dependencies, run the following commands:

    composer install

');
}

include('myapp.php');

myapp-phar-stub (bin)

示例 phar stub(bin/myapp-phar-stub),可以在需要之前使用它引导 phar 应用程序。

#!/usr/bin/env php
<?php

if (!$classLoader = @include __DIR__.'/../vendor/autoload.php') {
    die ('There is something terribly wrong with your archive.
Try downloading it again?');
}

include('myapp.php');

还有什么...

按名称查找已安装的包

可以使用 findPackage 方法搜索 Composer 安装的任何包

<?php
$package = $embeddedComposer->findPackage('acme/myapp');

Composer 目前没有在 installed.json 中安装表示本地存储库的根包。有一个 PR 添加到 Composer 核心中,但在此之前,可以使用以下解决方案。

将以下 post-autoload-dump 脚本添加到根包的 composer.json

{
    "scripts": {
        "post-autoload-dump": "Dflydev\\EmbeddedComposer\\Core\\Script::postAutoloadDump"
    }
}

这将在 vendor/dflydev/embedded-composer/.root_package.json 中写入一个附加存储库,如果找到,嵌入式 Composer 将自动使用它。如果根包需要包含在分发中,确保此文件是任何构建 phar 的一部分。

创建 Composer 安装器实例

安装器实例适用于处理针对外部配置的 installupdate 操作。在解决依赖项时,它将考虑嵌入式配置。

<?php
// requires creating an IOInterface instance
$installer = $embeddedComposer->createInstaller($io);

创建纯 Composer 实例

<?php
// requires creating an IOInterface instance
$composer = $embeddedComposer->createComposer($io);

许可证

MIT,请参阅 LICENSE。

社区

如果您有任何问题或想帮忙,请加入我们在 irc.freenode.net#dflydev 频道。

非原创

这里的大部分工作都得到了Composer团队以及#composer-dev中许多人的支持。

实际的代码最初是作为Sculpin的一部分出现的,后来被分离出来成为一个独立的项目。