【问题标题】:Composer package not showing up in autoload_namespacesComposer 包未显示在 autoload_namespaces 中
【发布时间】:2014-02-12 00:36:23
【问题描述】:

这应该很容易。我开发了一个名为 MyVendor\MyPackage 的包

MyVendor\MyPackage 里面是:

  • MyVendor\MyPackage\composer.json
  • MyVendor\MyPackage\MyClass.php

MyVendor\MyPackage\composer.json 文件包含:

{
    "name":"MyVendor/MyPackage",
    "description":"MyClass!!!",
    "keywords": ["MyKeyword"],
    "homepage": "http://MyPackage.com",
    "type":"library",
    "license": "MIT",
    "authors": [
        {
            "name": "ME",
            "email": "ME@ME.com",
            "homepage":"http://ME.com"
        }
    ],
    "require": {

    },
    "autoload":{
        "psr-4" : {
            "MyVendor\\MyPackage\\":""
        }
    }
}

现在我有另一个名为 MyOtherPackage 的项目,其 composer.json 文件如下所示:

{
"require": {
    "monolog/monolog": "1.2.*",
    "MyVendor/MyPackage": "1.0.0"
},
"autoload": {
    "psr-4": {
        "MyVendor\\MyOtherPackage\\": "MyOtherPackage/",
        "MyVendor\\": "/"
    }
},
"repositories": [
    {
        "type": "package",
        "package": {
            "name": "MyVendor/MyPackage",
            "version": "1.0.0",
            "source": {
                "url": "https://ME.com/svn/MyVendor/MyPackage/",
                "type": "svn",
                "reference": "trunk"
            }
        }
    }
]
}

所以 MyOtherPackage 依赖于 MyPackage。一切下载都很好,但如果我打开 autload_namespaces.php 它只包含独白。它看起来像这样:

return array(
    'Monolog' => array($vendorDir . '/monolog/monolog/src'),
);

为什么MyVendor/MyPackage 没有出现在namespaces.phpautoload_psr4.php 文件中? composer.json文件错了吗?

编辑我添加到 MyPackage composer.json 文件中。

【问题讨论】:

    标签: namespaces composer-php


    【解决方案1】:

    我想通了。似乎将存储库定义为一个包,我告诉作曲家它不是作曲家兼容的类,这意味着作曲家不会寻找 composer.json 文件。

    为了修复它,我删除了包定义并使依赖类的 composer.json 文件看起来像:

    {
        "require": {
             "monolog/monolog": "1.2.*",
             "MyVendor/MyPackage": "1.0.0"
        },
        "autoload": {
            "psr-4": {
                "MyVendor\\MyOtherPackage\\": "MyOtherPackage/",
                "MyVendor\\": "/"
            }
        },
        "repositories": [
            {
                "type": "svn",
                "url": "https://ME.com/svn/MyVendor/MyPackage/",
                "reference": "tags"
            }
        ]
    }
    

    这告诉 composer 从这个存储库下载包并查找 composer.json 文件。

    【讨论】:

      【解决方案2】:

      您没有在第一个包中定义任何自动加载机制。如果您不这样做,Composer 将无法知道如何自动加载类,并且什么也不做(如果您的包根本不包含任何 PHP,例如仅包含图像和 javascript,这是一个有效的选项)。

      添加如下内容:

      "autoload": {
          "psr-0": {
              "MyVendor\\Namespace":"src/path"
          }
      }
      

      【讨论】:

      • 我添加了"autoload":{ "psr-4" : { "MyVendor\\MyPackage\\":"" } } 并且当我运行composer install 时该包可以工作,但是当我将它作为依赖项包含时,它仍然没有出现在命名空间文件中。顺便感谢您的帮助!
      • PSR-4 自动加载不包含在autoload_namespaces.php 中,而是包含在autoload_psr4.php 中。
      • autoload_psr4.php 文件同样,映射中没有文件。它具有来自 MyOtherPackage 的自动加载定义,但没有来自 MyPackage。底线是当我尝试访问我得到的网页时:Class 'MyVendor\MyPackage\MyClass' not found in...
      • 我想知道是否永远找不到 MyPackage 的 composer.json 文件。我必须做些什么来告诉 Composer 它在哪里吗?存储库部分是否设置正确?
      猜你喜欢
      • 2018-08-09
      • 2017-09-15
      • 2017-07-01
      • 2023-03-13
      • 2019-07-28
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多