Задать вопрос
@demoniqus

Как устроена работа composer с репозиториями?

Добрый день. Столкнулся с непонятной для себя проблемой при работе с composer.
Сделал пару примитивных бандлов BaseBundle и SpecificBundle. Оба их выложил на github. При этом SpecificBundle имеет зависимость от BaseBundle:

BaseBundle/composer.json:
{
    "name": "my-vendor/my-base-bundle",
    "type": "symfony-bundle",
    "version": "1.0.0",
    "license": "proprietary",
    "minimum-stability": "dev",
    "prefer-stable": true,
    "authors": [
        {
            "name": "Author name",
            "email": "author_email@mail.ru"
        }
    ],
    "require": {
        "php": ">=8.0",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "doctrine/doctrine-bundle": "^2.14",
        "nelmio/api-doc-bundle": "^5.3",
        "symfony/asset": ">=5.4",
        "symfony/console": "7.3.*",
        "symfony/dotenv": "7.3.*",
        "symfony/flex": "^2",
        "symfony/framework-bundle": "7.3.*",
        "symfony/runtime": "7.3.*",
        "symfony/twig-bundle": ">=5.4",
        "symfony/yaml": "7.3.*"
    },
    "config": {
        "sort-packages": true,
        "allow-plugins": {
            "symfony/flex": true,
            "symfony/runtime": true
        }
    },
    "autoload": {
        "psr-4": {
            "MyVendor\\MyBaseBundle\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "MyVendor\\MyBaseBundle\\Tests\\": "tests/"
        }
    },
    "extra": {
        "symfony": {
            "allow-contrib": false,
            "require": ">=5.4"
        }
    }
}


SpecificBundle/composer.json:

{
    "name": "my-vendor/my-specific-bundle",
    "type": "symfony-bundle",
    "version": "1.0.0",
    "license": "proprietary",
    "minimum-stability": "dev",
    "prefer-stable": true,
    "authors": [
        {
            "name": "Author name",
            "email": "author_email@mail.ru"
        }
    ],
    "require": {
        "php": ">=8.0",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "my-vendor/my-base-bundle": ">=1.0",
        "symfony/console": "7.3.*",
        "symfony/dotenv": "7.3.*",
        "symfony/flex": "^2",
        "symfony/framework-bundle": "7.3.*",
        "symfony/runtime": "7.3.*",
        "symfony/yaml": "7.3.*"
    },
    "config": {
        "sort-packages": true,
        "allow-plugins": {
            "symfony/flex": true,
            "symfony/runtime": true
        }
    },
    "autoload": {
        "psr-4": {
            "MyVendor\\MySpecificBundle\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "MyVendor\\MySpecificBundle\\Tests\\": "tests/"
        }
    },
    "extra": {
        "symfony": {
            "allow-contrib": false,
            "require": ">=5.4"
        }
    },
    "repositories": {
        "my-base-bundle": {
            "type": "vcs",
            "url": "https://github.com/my-vendor/my-base-bundle.git"
        }
    }
}


В приложении подключаю репозиторий SpecificBundle:
app/composer.json
{
...
    "repositories": {
        "my-specific-bundle": {
            "type": "vcs",
            "url": "https://github.com/my-vendor/my-specific-bundle.git"
        }
    }
...
}


Затем выполняю composer require my-vendor/my-specific-bundle. Composer начинает разрешение зависимостей, находит SpecificBundle:
Root composer.json require my-vendor/my-specific-bundle * -> satisfiable by my-vendor/my-specific-bundle[1.0.0]

а далее идет ошибка:
my-vendor/my-specific-bundle 1.0.0 requires my-vendor/my-base-bundle ^1.0 -> could not be found in any version, there may be a typo in the package name


Почему composer не находит BaseBundle, если его принудительно не указать в app/composer.json?
Никаких проблем с наименованием репозитория BaseBundle нет - если зайти в каталог SpecificBundle и там выполнить composer require my-vendor/my-base-bundle, никаких проблем нет - всё работает. Сами репозитории публичные, проблем с доступом нет. Теги присутствуют. Даже пробовал делать релизы - не помогает. Также не помогает указывать тип репозитория как path с относительным и абсолютным путём.
На запрос о composer и репозиториях выдает базовую информацию https://getcomposer.org/doc/05-repositories.md, в которой нет даже намека, почему при указании обоих репозиториев в app/composer.json всё работает
  • Вопрос задан
  • 53 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
BoShurik
@BoShurik
Symfony developer
https://getcomposer.org/doc/04-schema.md#repositories

Это root-only опция. То, что вы указываете repositories в своих библиотеках никак не влияет на основной проект (что логично, иначе какой-нибудь зловредный пакет мог заменять популярные библиотеки)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы