ChatGPT解决这个技术问题 Extra ChatGPT

How to correctly require a specific commit in Composer so that it would be available for dependent packages?

I have a library foo/foo-lib which requires a specific commit from GitHub:

{
    "name": "foo/foo-lib",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/KnpLabs/Gaufrette.git"
        }
    ],
    "require": {
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

and it works fine:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                                 
  - Updating knplabs/gaufrette dev-master (2633721 => 2633721)
    Checking out 2633721877cae79ad461f3ca06f3f77fb4fce02e

Generating autoload files

but when I require that library in other project:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master"
    }
}

it yields dependency error:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for foo/foo-lib dev-master -> satisfiable by foo/foo-lib[dev-master].
    - foo/foo-lib dev-master requires knplabs/gaufrette dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e -> no matching package found.

So my question is: how to correctly require the specific commit from GitHub in my library, so that it would be available in dependent packages?

Be aware that when requiring a commit, composer will not honor that commits requirements (cmoposer.json). Instead it computes the branch head requirement which will change over time. So this might work for a while, but will break for sure in the future.

C
Chris

You'll have to explicitly require the Gaufrette library at that hash, with a dev flag, in both your library and your application. Something like this should work in the application composer.json:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master",
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

From the documentation:

If one of your dependencies has a dependency on an unstable package you need to explicitly require it as well, along with its sufficient stability flag.

The documentation also suggests that you'll need to include the repository for Gaufrette in your bar/bar-app Composer file, though it sounds like this wasn't necessary in this case. I'm not sure why.


I've already try this, doesn't work either. I think it may have something to do with Composer prefering Packagist over GitHub specifically?
Nope, I've checked with my local repositories - it's not a GitHub specific issue.
I'm fairly certain that I got this to work before. What if you add "minimum-stability": "dev" to the bar/bar-app requirements?
It looks like you're going to have to explicitly require Gaufrette at that hash in both your library, and your application. "If one of your dependencies has a dependency on an unstable package you need to explicitly require it as well, along with its sufficient stability flag." Note that you can have some packages, e.g. Gaufrette, at dev stability, and default to stable for everything else.
Looks like GitHub is supported by Composer out of the box - I've just removed the "url": "https://github.com/KnpLabs/Gaufrette.git" from first package and it still works.
p
powpow12

Here is how you do it on the command line:

composer update knplabs/gaufrette:dev-master#2633721 --with-dependencies

You don't have to use the whole hash, a hash seven characters long seems to dothe trick. As mentioned above, your project will need to support dev - which it will complain about if not already set. Also, use --with-dependencies to get any dependencies of the one you are updating.


Just tried this, seems to not work with Composer 2.
...so, how does one correlate a specific hash number to a given patch. In other words, how do we know what commit a patch was rolled against?
Seems to work if I use composer require instead of composer update.
worked for me with update on Composer version 2.1.6
G
Gayan Kalhara

If you're making changes for a Git Repository by forking make sure that you use the The package name is actually defined in the package's own composer.json file - so even though I'd forked the package to my own joshuapaling github account, and the package was now residing at the URL https://github.com/joshuapaling/Cake-Resque.git, that had not influenced the package's name at all, from composers perspective.

A stupid error - but I'm new to composer, and it wasn't clear at first! So, I hope this helps someone else with the same problem.