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

108

У меня есть библиотека, в 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 в моей библиотеке, чтобы она была доступна в зависимых пакетах?

Maciej Sz
источник
3
Имейте в виду, что, когда требуется фиксация, композитор не будет выполнять требования фиксации (cmoposer.json). Вместо этого он вычисляет требование заголовка ветки, которое со временем будет меняться. Так что это может работать какое-то время, но наверняка сломается в будущем.
Estani 08

Ответы:

157

Вам нужно будет явно потребовать библиотеку 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, хотя, похоже, в этом случае в этом нет необходимости. Не знаю почему.

Крис
источник
Уже пробовал, тоже не работает. Я думаю, это может быть как-то связано с тем, что Composer предпочитает Packagist, а не GitHub?
Maciej Sz
Нет, я проверил свои локальные репозитории - это не проблема GitHub.
Maciej Sz
Я почти уверен, что у меня это работало раньше. Что если добавить "minimum-stability": "dev"к bar/bar-appтребованиям?
Крис
3
Это выглядит , как вы будете иметь , чтобы явно требуют Gaufrette в то хэш как в вашей библиотеке, и приложения. «Если одна из ваших зависимостей имеет зависимость от нестабильного пакета, вам также необходимо явно потребовать его вместе с его флагом достаточной стабильности». Обратите внимание, что у вас могут быть некоторые пакеты, например Gaufrette, в devстабильном состоянии и по умолчанию stableдля всего остального.
Крис
2
Похоже, что GitHub поддерживается Composer из коробки - я только что удалил "url": "https://github.com/KnpLabs/Gaufrette.git"пакет из первого, и он все еще работает.
Maciej Sz
15

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

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

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

powpow12
источник
0

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

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

Гаян Калхара
источник