Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Composer does not generate autoloader information (autoload_namespaces.php)

I have trouble getting a project correctly installed through composer. I have a own custom package (library) hosted in a non public git repo (but centralized) which is fetched by composer (dummy project containing a composer.json just for testing my package).

So the structure is like that:


/test/project/composer.json
              index.php

Content of composer.json:

{
    "name": "vendor/test",
    "description": "Test-description",
    "authors": [{
        "name": "Benjamin Carl",
        "email": "[email protected]",
        "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": "[email protected]:benjamin.carl/bar.git",
                "type": "git",
            "reference": "master"
    }
        }
    }],
    "require": {
        "foo/bar": "0.0.1"   
    }
}

So when i run the composer install "php composer.phar install" within the folder containing the test-project and the composer.json you see above - everything seems to be fine - but - the autoloader information is missing - the map (array) in "autoload_namespaces.php" (files getting generated) keeps empty.

I assumed that when i install a package with composer and the package (in my case the package foo/bar) contains a composer.json file - this file is also executed/processed during installation and the information for autoloading is taken from this (package) composer.json file. Am i right? Or am i doing something wrong?


Here is the content of the "composer.json" file from package foo/bar:

{
    "name": "foo/bar",
    "description": "foo - the project for all bars out there.",
    "authors": [{
        "name": "Benjamin Carl",
        "email": "[email protected]",
        "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 protected]",
        "issues": "https://testdomain.com/issues",
    "wiki": "https://testdomain.com/wiki"
    },
    "repositories": [{
        "type": "vcs",
    "url": "https://git.testdomain.local/test/bar.git"
    }]
}

As the result of the configuration(s) above i want the autoloading information like this:

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

If i insert this line "'Foo' => ..." manually everything works fine. But i can't figure out why this information isn't written by composer to the "autoload_namespaces.php" file.

Thanks for any help :)

like image 713
PHPFlüsterer Avatar asked Mar 05 '26 02:03

PHPFlüsterer


1 Answers

If you try to install a private library/package via the "repositories" node of composer.json you have to re-specify the "autoload" node as well apparently.

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

I just spent a couple of hours figuring this out. Good job, Composer!

like image 159
zacharydanger Avatar answered Mar 06 '26 16:03

zacharydanger