¿Cómo requerir correctamente una confirmación específica en Composer para que esté disponible para paquetes dependientes?

108

Tengo una biblioteca foo/foo-lib, que requirescometer un específica de GitHub:

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

y funciona bien:

$ 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

pero cuando necesito esa biblioteca en otro proyecto:

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

produce error de dependencia:

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.

Entonces, mi pregunta es: ¿cómo realizar correctamente requirela confirmación específica de GitHub en mi biblioteca, para que esté disponible en paquetes dependientes?

Maciej Sz
fuente
3
Tenga en cuenta que cuando se requiere una confirmación, el compositor no cumplirá con los requisitos de la confirmación (cmoposer.json). En su lugar, calcula el requisito de cabezal de rama que cambiará con el tiempo. Entonces, esto podría funcionar por un tiempo, pero seguramente se romperá en el futuro.
Estani

Respuestas:

157

Tendrá que solicitar explícitamente la biblioteca Gaufrette en ese hash, con una devbandera, tanto en su biblioteca como en su aplicación. Algo como esto debería funcionar en la aplicación 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"
    }
}

De la documentación :

Si una de sus dependencias tiene una dependencia de un paquete inestable, también debe solicitarla explícitamente, junto con su indicador de estabilidad suficiente.

La documentación también sugiere que deberá incluir el repositorio de Gaufrette en su bar/bar-apparchivo Composer, aunque parece que esto no fue necesario en este caso. No estoy seguro de por qué.

Chris
fuente
Ya probé esto, tampoco funciona. Creo que puede tener algo que ver con Composer prefiriendo Packagist sobre GitHub específicamente.
Maciej Sz
No, lo he comprobado con mis repositorios locales; no es un problema específico de GitHub.
Maciej Sz
Estoy bastante seguro de que hice que esto funcionara antes. ¿Qué pasa si se suma "minimum-stability": "dev"a los bar/bar-apprequisitos?
Chris
3
Se ve como si se va a tener que exigir explícitamente Gaufrette en ese picadillo, tanto en su biblioteca y su aplicación. "Si una de sus dependencias tiene una dependencia de un paquete inestable, debe solicitarla explícitamente también, junto con su indicador de estabilidad suficiente". Tenga en cuenta que puede tener algunos paquetes, por ejemplo, Gaufrette, en devestabilidad y por defecto stablepara todo lo demás.
Chris
2
Parece que Composer admite GitHub "url": "https://github.com/KnpLabs/Gaufrette.git"desde el primer momento; acabo de eliminar el primer paquete y todavía funciona.
Maciej Sz
15

Así es como se hace en la línea de comando:

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

No tiene que usar todo el hash, un hash de siete caracteres parece ser suficiente. Como se mencionó anteriormente, su proyecto deberá ser compatible con el desarrollo, del cual se quejará si aún no está configurado. Además, use --with-dependenciespara obtener las dependencias del que está actualizando.

powpow12
fuente
0

Si está realizando cambios para un Repositorio de Git mediante la bifurcación, asegúrese de usar el El nombre del paquete está realmente definido en el propio archivo composer.json del paquete, así que aunque yo bifurqué el paquete en mi propia cuenta de joshuapaling github, y el paquete ahora residía en la URL https://github.com/joshuapaling/Cake-Resque.git , que no había influido en el nombre del paquete en absoluto, desde la perspectiva de los compositores.

Un error estúpido, pero soy nuevo en el mundo del compositor y no estaba claro al principio. Entonces, espero que esto ayude a alguien más con el mismo problema.

Gayan Kalhara
fuente