【发布时间】:2022-01-24 23:48:26
【问题描述】:
我正在尝试制作一个小 CLI 工具并与 composer 打包。
下面是一个极其简化的程序版本,但足以说明我遇到的问题。
项目有一个依赖,一个“二进制”文件
composer.json
{
"name": "alice/yamldump",
"version": "0.2.0",
"bin": [
"bin/yamldump"
],
"require": {
"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 global require alice/yamldump=dev-master
文件被安装到
~/.composer/vendor/bin/yamldump -> ../alice/yamldump/bin/yamldump~/.composer/vendor/alice/yamldump/~/.composer/vendor/symfony/yaml/
这是个问题,因为我不打算全局安装symfony/yaml并且我的包的vendor/autoload.php 无法再在正确的位置找到Yaml 包。
我不介意 symfony/yaml 是全局安装的,但我认为 composer global require 会像这样安装软件包:
~/.composer/vendor/bin/yamldump -> ../alice/yamldump/bin/yamldump~/.composer/vendor/alice/yamldump/~/.composer/vendor/alice/yamldump/vendor/symfony/yaml/
毕竟,如果我有依赖于symfony/yaml=2.5.3 的Package A 和需要symfony/yaml=2.6.x 的Package B 怎么办?
如果composer global require 将依赖项安装到~/.composer/vendor/*,则每个全局所需的包都无法维护它自己的依赖项版本要求...
我知道这是一个令人费解的问题,但我真的不知道如何着手解决它。
目标
用户应该能够
$ composer global require alice/yamldump=dev-master
$ yamldump sample.yml
错误
$ yamldump sample.yml
Warning: require_once(vendor/autoload.php): failed to open stream: No such file or directory in /Users/alice/.composer/vendor/alice/yamldump/bin/yamldump on line 8
Fatal error: require_once(): Failed opening required 'vendor/autoload.php' (include_path='.:') in /Users/alice/.composer/vendor/alice/yamldump/bin/yamldump on line 8
问题
这里是黑白的:
我打算如何编写require "vendor/autoload.php" 行并使其适用于本地安装的包和全局安装的包?
【问题讨论】:
标签: php package composer-php packagist