How to require a fork with composer?

PhpComposer Php

Php Problem Overview


This is my composer.json, I want to use Nodge's fork of lessphp project on Github

 "repositories": [{
    "type": "package",
    "package": {
        "version": "dev-master",
        "name": "nodge/lessphp",
        "source": {
            "url": "https://github.com/Nodge/lessphp.git",
            "type": "git",
            "reference": "master"
        },
        "autoload": {
            "classmap": ["lessc.inc.php"]
        }
    }
}],
"require": {
    "php": ">=5.3.3",
    "nodge/lessphp": "dev-master"
},

But I get this error when I run composer update:

> nodge/lessphp dev-master -> no matching package found.

I don't know how to require correctly this fork.

Php Solutions


Solution 1 - Php

The most common (and easiest) way of doing it is using a VCS repository.

> All you have to do is add your fork as a repository and update the > version constraint to point to your custom branch. Your custom branch > name must be prefixed with dev-.

Assuming you forked monolog/monolog and created a branch called bugfix, you would update your composer.json like this:

{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/igorw/monolog"
        }
    ],
    "require": {
        "monolog/monolog": "dev-bugfix"
    }
}

Note that you don't change the require statement except to specify your bugfix branch. You still reference the upstream package (monolog/monolog), not your personal fork (igorw/monolog), and the branch name is prefixed with dev-. You can read details in the docs

Solution 2 - Php

Using VCS works:

"name": "test/test",
"repositories": [{
    "type": "vcs",
    "url": "http://github.com/Nodge/lessphp"
}],
"require": {
    "leafo/lessphp": "dev-master"
},

But if I require a module that has this composer.json, it doesn't work. It installs the original project, not the fork.

Example

"name": "example/example",
"require": {
    "test/test": "dev-master"
},

I should mention again the repository. Is that normal?

Solution 3 - Php

If you can't get @Neilime answer to work for you, make sure your fork uses a different branch.

For example push your changes to a branch on your fork called my-bugfix, do not added dev- prefix in your branch name but in your composer.json you have to add it. Your composer file will look like:

"repositories":
[
    {
        "type": "vcs",
        "url": "http://github.com/yourname/packageName"
    }
],
"require": {
    "owner/packageName": "dev-my-bugfix"
},

Solution 4 - Php

I have tried many options but After I got this post I saw the light and it just worked perfect.

This is what you have to do:

1- Fork The repository

2- Create a branch and make the required modifications.

3- Add the repository label to your composer.json

"repositories": [
     
        {
            "type": "vcs",
            "url": "https://github.com/user/yourforkname"
        }
    ]

4- In the command line inside your project require your fork like this:

composer require vendor/packagename:dev-branchname

And Voilá!!

You have your fork version working

Solution 5 - Php

According to the Composer documentation http://getcomposer.org/doc/05-repositories.md#vcs, it's enough to specify the original repository (not the fork) in the require ("nodge/lessphp" in your case). Composer will then install YOUR fork (look at the code in the vendors)

Solution 6 - Php

So, this is 2019, and most of the answers here are already correct.

If you find yourself however, in a situation where you need to require a particular branch of your fork (that you created), have composer list the available versions/tags first. This saved me a lot of time.

A full example with spatie/laravel-backup package.

First, add repositories key to composer.json. With the url of your fork

"repositories": [{
   "type": "vcs",
   "url": "https://github.com/holymp2006/laravel-backup"
 }]

Get available versions/tags

composer show "spatie/laravel-backup" --all

Choose the version you want from versions in the terminal output, then require that version

composer require spatie/laravel-backup:v5.x-dev

Solution 7 - Php

I usually add a "dist" node to the package definition. I never had a problem using it this way.

I can't remember where I got this trick from, though, for any further explanations.

{
	"repositories": [
	    {
		    "type": "package",
		    "package": {
		        "version": "dev-master",
		        "name": "nodge/lessphp",
		        "source": {
		            "url": "https://github.com/Nodge/lessphp.git",
		            "type": "git",
		            "reference": "master"
		        },
		        "autoload": {
		            "classmap": ["lessc.inc.php"]
		        },
		        "dist": {
		        	"url": "https://github.com/Nodge/lessphp/archive/master.zip",
		        	"type": "zip"
		        }
		    }
		}
	],
    "require": {
        "nodge/lessphp": "*"
    }
}

Solution 8 - Php

The accepted answer and clarifying answers all worked well for me when I had ex. an application, which needed a dependency I had forked and modified. I’d still use the accepted answer in this case.

However, when I had a package I wanted to distribute myself on Packagist, which also contained a forked and modified dependency, this approach no longer worked.

If someone were to try and install with this config, they’ll still get that same -> no matching package found. error message.

This answer and the linked Composer docs suggest that the repo settings have to be at the top-level composer.json. That means, someone installing this package would have to add that config to their composer.json file too—which adds a lot of unnecessary confusion to the install process.

Instead, I published my fork to Packagist. My understanding is that while forks are frowned upon, this would be considered a maintained fork, since I am using it for this new package.

Hopefully that’s helpful for anyone who has this problem with a package or library they’d like to distribute.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNeilimeView Question on Stackoverflow
Solution 1 - PhpSeldaekView Answer on Stackoverflow
Solution 2 - PhpNeilimeView Answer on Stackoverflow
Solution 3 - PhpBoedyView Answer on Stackoverflow
Solution 4 - PhpLuis Mata B.View Answer on Stackoverflow
Solution 5 - PhpE CiottiView Answer on Stackoverflow
Solution 6 - PhpSamView Answer on Stackoverflow
Solution 7 - Phpuser3497737View Answer on Stackoverflow
Solution 8 - PhpkennethormandyView Answer on Stackoverflow