【问题标题】:How to configure a composer package to be globally installed?如何将作曲家包配置为全局安装?
【发布时间】: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 -&gt; ../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 -&gt; ../alice/yamldump/bin/yamldump
  • ~/.composer/vendor/alice/yamldump/
  • ~/.composer/vendor/alice/yamldump/vendor/symfony/yaml/

毕竟,如果我有依赖于symfony/yaml=2.5.3Package A 和需要symfony/yaml=2.6.xPackage 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


    【解决方案1】:

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

    如果您直接在应用程序上工作,这首先会在您期望的位置查找自动加载器。如果不存在,它会查看自动加载器在您的应用程序作为依赖项安装时的位置。

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 2013-05-26
      • 2018-01-22
      • 2019-08-03
      • 2014-02-26
      • 2020-11-17
      • 2020-01-26
      • 2014-01-29
      • 2017-09-15
      相关资源
      最近更新 更多