【问题标题】:Composer does not generate autoloader information (autoload_namespaces.php)Composer 不生成自动加载器信息 (autoload_namespaces.php)
【发布时间】:2013-08-09 00:27:43
【问题描述】:

我无法通过 composer 正确安装项目。我有一个自己的自定义包(库)托管在非公共 git repo(但集中)中,由 composer 获取(包含 composer.json 的虚拟项目,仅用于测试我的包)。

所以结构是这样的:


/test/project/composer.json
              index.php

composer.json 的内容:

{
    "name": "vendor/test",
    "description": "Test-description",
    "authors": [{
        "name": "Benjamin Carl",
        "email": "email@testdomain.com",
        "homepage": "http://www.testdomain.com",
        "role": "Developer"
    }],
    "keywords": [
        "foo",
        "bar"
    ],
    "homepage" : "http://www.testdomain.com/",
    "license" : [
        "The BSD License"
    ],
    "repositories": [{
        "type": "package",
        "package": {
            "name": "foo/bar",
            "version": "0.0.1",
            "source": {
            "url": "git@git.testdomain.local:benjamin.carl/bar.git",
                "type": "git",
            "reference": "master"
    }
        }
    }],
    "require": {
        "foo/bar": "0.0.1"   
    }
}

所以当我在上面看到的包含测试项目和 composer.json 的文件夹中运行 composer install "php composer.phar install" - 一切似乎都很好 - 但是 - 缺少自动加载器信息 - 地图“autoload_namespaces.php”(正在生成的文件)中的(数组)保持为空。

我假设当我使用 composer 安装一个包并且包(在我的例子中是包 foo/bar)包含一个 composer.json 文件 - 这个文件也在安装过程中执行/处理,并且自动加载的信息取自这个(包)composer.json 文件。我对吗?还是我做错了什么?


这是来自包 foo/bar 的“composer.json”文件的内容:

{
    "name": "foo/bar",
    "description": "foo - the project for all bars out there.",
    "authors": [{
        "name": "Benjamin Carl",
        "email": "email@testdomain.com",
        "homepage": "http://www.testdomain.com",
        "role": "Developer"
    }],
    "keywords": [
    "php",
        "foo",
    "bar",
        "baz"
    ],
    "homepage": "http://testdomain.com/",
    "license": [
        "The BSD License"
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
        "Foo": "Framework/"
    }
    },
    "include-path": ["Framework/"],
    "support": {
        "email": "email@testdomain.com",
        "issues": "https://testdomain.com/issues",
    "wiki": "https://testdomain.com/wiki"
    },
    "repositories": [{
        "type": "vcs",
    "url": "https://git.testdomain.local/test/bar.git"
    }]
}

由于上面的配置,我想要这样的自动加载信息:

$data = array(
    'Foo' => $vendorDir . '/foo/bar/Framework'
);

如果我手动插入这一行“'Foo' => ...”,一切正常。但我不明白为什么作曲家没有将这些信息写入“autoload_namespaces.php”文件。

感谢您的帮助:)

【问题讨论】:

  • 您能否展示您的库的完整目录结构,包括源代码在哪里? (或其混淆版本)。

标签: php json composer-php autoload psr-0


【解决方案1】:

您的包foo/bar 已声明include-path。根据文档(请参阅http://getcomposer.org/doc/04-schema.md#include-path),此功能已被弃用,只能用于支持无法自动加载的遗留代码。

我认为这是您的包没有被添加到自动加载的原因,因为它也可以通过包含路径加载(这是一件坏事,因为性能影响太大 - 不惜一切代价避免它)。

【讨论】:

    【解决方案2】:

    如果您尝试通过composer.json 的“存储库”节点安装私有库/包,您显然也必须重新指定“自动加载”节点。

    {
      "repositories": [{
        "type": "package",
        "package": {
          "name": "foo/bar",
          "version": "0.0.1",
          "source": {
            "url": "git@git.testdomain.local:benjamin.carl/bar.git",
            "type": "git",
            "reference": "master"
          },
          "autoload": {
            "psr-0": {
            "Foo": "Framework/"
          }
        }
      }]
    }
    

    我只是花了几个小时才弄清楚这一点。干得好,作曲家!

    【讨论】:

    • 我已经用当前的活动版本进行了尝试,它可以工作!非常感谢您分享您的知识 :)
    • 非常烦人的问题。我最终在 packagist.org 上启动了我的包并运行 composer require [package name]。这也将解决此问题。
    【解决方案3】:

    如果您需要软件包而不更改默认安装路径(即vendor 文件夹),则 Zacharydanger 解决方案有效。

    如果您使用composer/installer-paths 并将您的包安装在供应商文件夹之外,您需要相应地设置自动加载路径。

    {
      "repositories": [{
        "type": "package",
        "package": {
          "name": "foo/bar",
          "version": "0.0.1",
          "source": {
            "url": "git@git.testdomain.local:benjamin.carl/bar.git",
            "type": "git",
            "reference": "master"
          },
          "extra": {
            "installer-paths": {
              "core/{$name}": [
                "type:git-package"
              ]
            }
          },
          "autoload": {
            "psr-0": {
            "Foo": "core/Framework/"
          }
        }
      }]
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 2020-01-21
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 2017-01-05
      • 2016-06-10
      相关资源
      最近更新 更多