Composer不会生成自动加载器信息(autoload_namespaces.php)

时间:2013-08-07 14:49:44

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

我无法通过composer正确安装项目。我有一个自己的自定义包(库)托管在一个非公共git仓库(但集中),由作曲家提取(包含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"   
    }
}

所以,当我在包含test-project和composer.json的文件夹中运行作曲家安装“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”文件。

感谢您的帮助:)

3 个答案:

答案 0 :(得分:8)

如果您尝试通过"存储库"安装私有库/包。 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/"
      }
    }
  }]
}

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您需要软件包而无需更改默认安装路径(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/"
      }
    }
  }]
}