Как правильно потребовать конкретную фиксацию в Composer, чтобы она была доступна для зависимых пакетов?

У меня есть библиотека foo/foo-lib, которая requires определяет конкретную фиксацию из GitHub:

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

и он отлично работает:

$ 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

но когда мне нужна эта библиотека в другом проекте:

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

он дает ошибку зависимостей:

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.

Итак, мой вопрос: как правильно require определить конкретную фиксацию из GitHub в моей библиотеке, чтобы она была доступна в зависимых пакетах?

Ответ 1

Вам нужно будет явно потребовать библиотеку Gaufrette при этом хеше с флагом dev как в вашей библиотеке, так и в вашем приложении. Что-то вроде этого должно работать в приложении 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"
    }
}

Из документации:

Если одна из ваших зависимостей имеет зависимость от неустойчивого пакета вам также необходимо явно указать его, а также его достаточное количество флаг стабильности.

В документации также указывается, что вам нужно будет включить репозиторий для Gaufrette в ваш файл bar/bar-app Composer, хотя, похоже, в этом случае это не было необходимо. Я не уверен, почему.

Ответ 2

Вот как вы это делаете в командной строке:

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

Вам не нужно использовать весь хеш, хеш длиной в семь символов, кажется, делает трюк. Как упоминалось выше, ваш проект должен поддерживать dev - на что он будет жаловаться, если он еще не установлен. Также используйте --with-dependencies для получения любых зависимостей того, который вы обновляете.

Ответ 3

Если вы вносите изменения в репозиторий Git путем разветвления, убедитесь, что вы используете имя пакета, которое на самом деле определено в собственном файле пакета composer.json - так что, хотя я разветвлял пакет на мою собственную учетную запись joshuapaling github, и пакет теперь находится по адресу https://github.com/joshuapaling/Cake-Resque.git, который вообще не влиял на имя пакета, с точки зрения композиторов.

Глупая ошибка - но я новичок в композиторе, и сначала это было непонятно! Итак, я надеюсь, что это поможет кому-то еще с той же проблемой.