dflydev / embedded-composer
将Composer嵌入到另一个应用中
Requires
- php: >=5.3.2
- composer/composer: ^1.0
Requires (Dev)
- phpunit/phpunit: ~3.7.10
- symfony/console: ~2.3@dev
- symfony/http-kernel: ~2.1
Suggests
- symfony/console: ~2.3
- symfony/http-kernel: ~2.1
Replaces
- dflydev/embedded-composer-bundle: dev-master
- dflydev/embedded-composer-console: dev-master
- dflydev/embedded-composer-core: dev-master
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实例适合处理针对外部配置的install
和update
操作。在解决依赖项时,它将考虑内部(嵌入式)配置。
<?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项目的一部分,后来独立成为一个项目。