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);
}