jonbaldie jonbaldie - 3 months ago 15
Git Question

Private repo composer.json not being used

My problem is that a privately made repo's composer.json seems to be broken when trying to use it as a package elsewhere.

I have a private repo with code needed for other projects. The repo's composer.json looks like this:

{
"name": "somevendor/global",

"require": {
"nesbot/carbon": "^1.21"
},

"autoload": {
"psr-4": {
"" : "src/"
},
"files": [
"somedir/somefile.php"
]
}
}


The
src
is in the base directory of the repo, and contains PSR-4 namespaced classes. I have namespace folders within that, e.g. a
Foo
directory with classes in the
Foo
namespace:

-- src
-- Foo
// some Foo\... classes
// some global namespace classes
-- somedir
somefile.php // A file with helper functions


In the project folder, I'm accessing the
somevendor/global
repo via a composer.json file:

{
"require": {
"somevendor/global-folder": "dev-master"
},

"repositories": [
{
"type": "package",
"package": {
"name": "somevendor/global",
"version": "dev-master",
"type": "package",
"source": {
"url": "git@bitbucket.org/somevendor/global.git",
"type": "git",
"reference": "master"
}
}
}
]
}


Running
composer install
in the project folder seems to work at first. I have installed SSH keys properly so it can access the private repo on Bitbucket and grab the files:

$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing somevendor/global (dev-master master)
Cloning master

Writing lock file
Generating autoload files


And then in the project's PHP code I
require vendor/autoload.php
, but none of the classes are being autoloaded, including the
Carbon
package specified in the first repo's composer.json file:

Fatal error: Uncaught Error: Class 'Foo\Foo' not found in...


I've clearly made a mistake here, have I structured the first repo wrongly?

Answer

I "solved" this by taking out all of the "require" entries from the remote repo's composer.json file and moving them to the local website's composer.json file.

This is what the files looked like:

The remote private repo's composer.json:

{
    "name": "somevendor/global",
    "license": "proprietary",
    "autoload": {
        "psr-4": {
            "" : "src/"
        },
        "files": [
            "functions/functions.php"
        ]
    }
}

The local website's composer.json:

{
    "require": {
        "nesbot/carbon": "^1.21",
        "somevendor/global": "dev-master"
    },

    "repositories": [
        {
            "type": "vcs",
            "url": "git@bitbucket.org:somevendor/global.git"
        }
    ]
}

It kept throwing Composer\Repository\InvalidRepositoryException because I forgot to put the name into the remote repo's composer.json file, so don't forget that bit!

Also remember to set up your git ssh keys if you've set them up. I used this Bitbucket tutorial to do this.

Comments