Php 如何配置要全局安装的composer软件包?
更新: 实际上,我发布了这个包,这样你就可以自己看到问题了 看看这里Php 如何配置要全局安装的composer软件包?,php,package,composer-php,packagist,Php,Package,Composer Php,Packagist,更新: 实际上,我发布了这个包,这样你就可以自己看到问题了 看看这里 我正在尝试制作一个小型CLI工具,并使用composer将其打包 下面是该程序的一个极其简化的版本,但足以说明我遇到的问题 该项目有一个依赖项和一个“二进制”文件 composer.json { “名称”:“naomik/yamldump”, “版本”:“0.2.0”, “bin”:[ “bin/yamldump” ], “要求”:{ “symfony/yaml”:“2.5.3” } } bin/yamldump #!/u
我正在尝试制作一个小型CLI工具,并使用composer将其打包 下面是该程序的一个极其简化的版本,但足以说明我遇到的问题 该项目有一个依赖项和一个“二进制”文件 composer.json
{
“名称”:“naomik/yamldump”,
“版本”:“0.2.0”,
“bin”:[
“bin/yamldump”
],
“要求”:{
“symfony/yaml”:“2.5.3”
}
}
bin/yamldump
#!/usr/bin/env php
<?php
// use Yaml namespace
use Symfony\Component\Yaml as Yaml;
// autoload
require_once "vendor/autoload.php";
// read yaml
$yaml = file_get_contents(sprintf("%s/%s", getcwd(), $argv[1]));
// create parser
$parser = new Yaml\Parser();
// parse the yaml
var_dump($parser->parse($yaml));
文件安装到
~/.composer/vendor/bin/yamldump->../naomik/yamldump/bin/yamldump
~/.composer/vendor/naomik/yamldump/
~/.composer/vendor/symfony/yaml/
symfony/yaml
和我的软件包的vendor/autoload。php
无法再在正确的位置找到yaml软件包
我不介意symfony/yaml
是全局安装的,但对我来说,composer global require
会像这样安装软件包:
~/.composer/vendor/bin/yamldump->../naomik/yamldump/bin/yamldump
~/.composer/vendor/naomik/yamldump/
~/.composer/vendor/naomik/yamldump/vendor/symfony/yaml/
symfony/yaml=2.5.3的包A
和需要symfony/yaml=2.6.x
的包B
,该怎么办
如果composer-global-require
将依赖项安装到~/.composer/vendor/*
,则每个全局所需的包都无法维护其依赖项的自身版本要求
我知道这是一个复杂的问题,但我真的不知道如何开始解决它
目标
用户应该能够
$ composer global require naomik/yamldump=dev-master
$ yamldump sample.yml
错误
$yamldump sample.yml
警告:require_once(vendor/autoload.php):无法打开流:第8行的/Users/naomik/.composer/vendor/naomik/yamldump/bin/yamldump中没有此类文件或目录
致命错误:require_once():无法在第8行的/Users/naomik/.composer/vendor/naomik/yamldump/bin/yamldump中打开所需的“vendor/autoload.php”(include_path='.:')
问题
这里是黑白的:
我打算如何编写require“vendor/autoload.php”
行,并使其同时适用于本地安装的软件包和全局安装的软件包?针对vendor/autoload.php
通常不是一个好主意,只有在从正确的目录运行脚本时才有效。以下内容将更好地为您服务:
require_once __DIR__.'/../vendor/autoload.php';
但是,如果您的应用程序作为依赖项安装,这仍然可能是一个问题。在这种情况下,您可能需要更实质性的东西:
if (
(!$classLoader = includeIfExists(__DIR__.'/../vendor/autoload.php')) &&
(!$classLoader = includeIfExists(__DIR__.'/../../../autoload.php'))
) {
echo 'You must set up the project dependencies, run the following commands:'.PHP_EOL.
'curl -sS https://getcomposer.org/installer | php'.PHP_EOL.
'php composer.phar install'.PHP_EOL;
exit(1);
}
如果您直接在应用程序上工作,首先会在您期望的位置查找自动加载器。如果不存在,它会显示应用程序作为依赖项安装时自动加载程序的位置
if (
(!$classLoader = includeIfExists(__DIR__.'/../vendor/autoload.php')) &&
(!$classLoader = includeIfExists(__DIR__.'/../../../autoload.php'))
) {
echo 'You must set up the project dependencies, run the following commands:'.PHP_EOL.
'curl -sS https://getcomposer.org/installer | php'.PHP_EOL.
'php composer.phar install'.PHP_EOL;
exit(1);
}