Как в PHP composer подменить пакет на свой репозиторий

По сути это продолжение статьи как сделать git fork из github в bitbucket, т.к. одно из другого крайне бессмысленно. Допустим, есть какая-то хорошая публичная библиотека на github, нов ней есть фатальный недостаток, который автор библитеки не хочет, не может и не будет исправлять. При этом архитектура библиотеки такова, что нельзя просто так взять и отнаследоваться и переопределить поведение. А делать правку в коде и хранить весь этот хардкод в основном репозитории не позволяет здравый смысл.

Итак, вы сделали форк библиотеки в свой репозиторий и внесли необходимые правки. как теперь заставить composer по командам install или update загружать библиотеку из вашего репозитория, а не из оригинального? Самый простой и наименее геморройный способ делается в два шага. Во-первых, нужно отредактировать compose.json в своём репозитории и заменить оригинальное значение поля name на своё. Например, было owner/origin-repo, стало my/forked-repo.

Во-вторых, отредактировать composer.json файл своего проекта и добавить свой репозиторий:

"repositories": [
    {
        "type": "git",
        "url": "[email protected]:my/forked-repo.git"
    }
]

А в секции require заменить owner/origin-repo на my/forked-repo.

И ещё маленький штрих: если вы сообразили, что вносить правки в ветку master не самая хорошая идея и создали новую ветку для своих правок, например, forked, то и в composer.json своего проекта нужно указать, что изменения нужно стягивать именно из этой ветки, достаточно в качестве версии указать dev-forked.

Либо выполнить команду:

composer require username/reponame dev-master

Существуют и другие, более хардкорные способы это сделать, но рекомендовать я их не буду, т.к. они требуют больших усилий и имеют свои ограничения и недостатки.

Если вдруг вы получили ошибку на подобии этой:

[RuntimeException]
  Failed to execute git clone --mirror "[email protected]:username/reponame.git" "/some/composer/path"
  Cloning into bare repository '/some/composer/path/vcs/git-bitbucket.org-org:username-reponame.git'...
  repository access denied. deployment key is not associated with the requested repository.
  fatal: Could not read from remote repository.
  Please make sure you have the correct access rights
  and the repository exists.

Это значит, что нужно добавить ssh-ключ в репозиторий, для этого нужно открыть страницу https://bitbucket.org/username/reponame/admin/access-keys/ и добавить ключ.