dflydev/embedded-composer

将Composer嵌入到另一个应用中

dev-master / 1.0.x-dev 2018-04-18 14:50 UTC

This package is auto-updated.

Last update: 2024-08-29 03:36:40 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 Installer实例

Installer实例适合处理针对外部配置的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项目的一部分,后来独立成为一个项目。