1

我正在学习如何制作作曲家包。到目前为止,我已经这样做了:

作曲家.json

{
  "name": "Iv/MyPackage",
  "autoload": {
    "psr-4": {
      "Iv\\MyPackage\\": "src/"
    }
  },
  "require": {
    "guzzlehttp/guzzle": "~6.0"
  },
  "require-dev": {
    "phpunit/phpunit": "4.*",
    "guzzlehttp/guzzle": "~6.0"
  },
  "autoload-dev": {
    "psr-4": {
      "Iv\\MyPackage\\Tests\\": "tests/"
    }
  }
}

我在命名空间下有一个类:namespace Iv\MyPackage\Api;被调用Consumer并且在它的__construct方法中它有这个:

public function __construct(array $credentials)
{
    $this->client = new Client();
    $this->credentials = $credentials;
}

在那个班级的顶部,我有use GuzzleHttp\Client;

我得到的错误是: Fatal error: Class 'GuzzleHttp\Client' not found in path\to\package\Iv\MyPackage\src\Api\Consumer.php on line 27当我这样做时:

$package = new Iv\MyPackage\Api\Consumer(['user', 'password']);
$query = $api->prepare('/api-endpoint', 'GET');

编辑

这是我的Consumer课的样子:

<?php

namespace Iv\MyPackage\Api;


use GuzzleHttp\Client;
class Consumer
{
    private $credentials = [];

    public function __construct(array $credentials)
    {
        $this->client = new Client();
        $this->credentials = $credentials;
    }
    ...
}

我也在使用 PhpStorm,它告诉我我有这个GuzzleHttp包,因为当我输入Client()并按ALT+时它会自动为我导入它ENTER。这意味着我已经跑了composer install/update

编辑 2:我有一个文件 -index.php其中包含以下内容:

<?php
include('vendor/autoload.php');

$api = new Iv\MyPackage\Api\Consumer(['user', 'password']);

$query = $api->prepare('/endpoint', 'GET');

var_dump($api->execute($query));

文件夹结构如下:

-Iv/
--MyPackage/
---src/
----Api/
----Exceptions/
----vendor/
----tests/
----otherfiles (composer.json, phpunit.xml, etc)
-vendor/
-composer.json
-index.php (I mentioned above)

编辑3:我的内容vendor/composer/autoload_psr4.php

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
    'Iv\\MyPackage\\Tests\\' => array($baseDir . '/tests'),
    'Iv\\MyPackage\\' => array($baseDir . '/src'),
    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
    'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
);

编辑 4

index.php我有这个作曲家的文件夹中:

{
  "name": "Test MyPackage",
  "autoload": {
    "psr-4": {"Iv\\MyPackage\\": "Iv/MyPackage/src"}
  }
}

^^ 我在一个主题中看到,OP 在将其上传到 packagist/git 之前询问如何测试他的包。我可以加载Consumer类,没有错误,但没有找到每个依赖项。( GuzzleHttp\Client, Symfony\Component\Yaml\Parser, 等)

4

2 回答 2

1

composer.json主目录中,您缺少对包的引用。您只是在自动加载它,但并没有自动加载它的所有依赖项。

为此,您必须composer.json在主目录中添加这样的部分:

"repositories": [
    {
        "url": "path/to/your/package",
        "type": "path"
    }
]

并将其添加到该require部分,例如:

"require": {
    "Iv/MyPackage" : "dev-master"
}

或者,您可以将依赖项从composer.json包内部移动到主目录中的依赖项

于 2015-11-26T19:20:54.877 回答
0

我认为你几乎把所有事情都搞混了,但这是可以解决的。

我看到的是你有一个奇怪的目录结构:你有Iv/MyPackage/src/...你的主项目(即在同一级别有一个文件composer.json)。

如果您想在主项目中使用“Iv/MyPackage”作为 Composer 包,则必须将其添加为依赖项。这意味着您的包名必须出现在"require"composer.json文件的 -Section 中。目前不是。取而代之的是,您手动为您的包当前所在的路径添加了自动加载 - 没有告诉 Composer 这应该被视为一个包,并且它具有也应该下载的依赖项。

您在它的目录中添加了包的依赖项,但这不是 Composer 的工作方式。

要修复它,您必须做两件简单的事情:

  1. 将您的包添加为 main 中的依赖项composer.json
  2. 如果您的包当前托管在私有存储库中,则必须将其 URL 添加repositoriescomposer.json.

第一个就是这样:

{
  "name": "Test MyPackage",
  "require": {
    "Iv/MyPackage": "dev-master"
  },
  "autoload": {
  }
}

删除包的自动加载 - 它已经包含在该包中。如果您希望 Composer 自动加载您的主项目,请在此处添加自动加载(我建议您这样做,因为您自己可能无法编写更好的自动加载器)。

第二件事是添加存储库:

{
  "name": "Test MyPackage",
  "repositories": [
    { 
      "type": "vcs", 
      "url": "your repo url, either http or ssh" 
    }
  ],
  "require": {
    "Iv/MyPackage": "dev-master"
  },
  "autoload": {
  }
}

这告诉 Composer 去查看那个存储库,看看它是否能找到一些东西。找到的所有内容都将添加到已知包的集合中(默认来源为 Packagist),并用于选择最佳版本匹配。

您应该应用的一些更正:

  1. 包名应该小写,所以最好使用iv/mypackage.
  2. 如果您在主项目中命名,它必须遵循表单<vendor>/<package>,而不是带有名称的随机字符串。Composer 不会拒绝工作,但是一旦您到达那里,您将受益于 Composer 区域中更多可用的基础架构,并且正确的名称将对您有所帮助。否则,暂时将其放在一边。

这应该可以让您启动并运行。我可能可以回答您甚至没有问过的更多细节,但建议您在文档页面或 Stackoverflow 上阅读有关 Composer 的信息,因为常见问题通常已经解决。

于 2015-11-26T19:43:49.800 回答