更新
我实际发布了这个软件包,因此您可以自己查看问题。
请在此处查看naomik/yamldump
我正在尝试制作一个小型CLI工具并将其与作曲家打包。
以下是该程序的极简化版本,但它足以证明我遇到的问题。
项目有一个依赖项和一个“二进制”文件
composer.json
{
"name": "naomik/yamldump",
"version": "0.2.0",
"bin": [
"bin/yamldump"
],
"require": {
"symfony/yaml": "2.5.3"
}
}
仓/ 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 global require naomik/yamldump=dev-master
文件已安装到
~/.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/
毕竟,如果Package A
取决于需要symfony/yaml=2.5.3
的{{1}}和Package B
会怎样?
如果symfony/yaml=2.6.x
安装了composer global require
的依赖关系,则每个全局必需的包都无法维护自己的依赖关系的版本要求......
我知道这是一个令人费解的问题,但我真的不知道如何开始修复它。
目标
用户应该能够
~/.composer/vendor/*
错误
$ composer global require naomik/yamldump=dev-master
$ yamldump sample.yml
问题
这是黑色&amp;白:
我打算如何编写$ yamldump sample.yml
Warning: require_once(vendor/autoload.php): failed to open stream: No such file or directory in /Users/naomik/.composer/vendor/naomik/yamldump/bin/yamldump on line 8
Fatal error: require_once(): Failed opening required 'vendor/autoload.php' (include_path='.:') in /Users/naomik/.composer/vendor/naomik/yamldump/bin/yamldump on line 8
行并使其适用于本地安装的软件包和全局安装的软件包?
答案 0 :(得分:3)
定位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);
}
如果您直接在应用程序上工作,首先会在您希望的位置查找自动加载器。如果不存在,那么如果您的应用程序作为依赖项安装,它将查看自动加载器的位置。