Composer / Laravel устанавливает пакет из существующих файлов, когда внешний репозиторий больше не существует - PullRequest
3 голосов
/ 04 марта 2020

У меня следующая проблема: у меня есть старый проект, который использует Laravel 4.2, PHP 5.5.9 и Composer. Я пытаюсь установить его на другом компьютере (с Laravel 4.2.2 и PHP 5.6), но у одного из необходимых пакетов есть зависимость, которая отсутствует, потому что тот, кто управлял этой учетной записью GitHub, решил удалить ее. Таким образом, требуемый пакет не может быть установлен с помощью Composer.

Теперь в старом проекте эти пакеты загружены, и я могу скопировать оба из них вручную. Чего я не знаю, так это как правильно добавить их в проект и не дать composer попытаться загрузить их заново.

Нет примеров кода, так как они не нужны.

1 Ответ

1 голос
/ 04 марта 2020

Если у вас есть файлы, и вы не сможете продолжать использовать composer для управления этим пакетом (например, для обновлений, удаления и т. Д. c), тогда вам просто нужно обращаться с файлами, как будто они принадлежал вашему проекту.

Трудно дать вам подробности, не зная больше о пакете, который вы хотите использовать, но общий подход будет таким:

Скажем, пакет, который вы хотите использовать это funtastic/foobar. Если у вас есть файлы из вашего старого vendor, нам просто нужен каталог внутри vendor/funtastic, который может называться foobar.

Сначала скопируйте файлы в свой проект. Поскольку они принадлежат к другому пространству имен, чем остальная часть вашего приложения, я лично не стал бы помещать их в src. Вы можете поместить их в новый каталог, например lib.

Так что теперь ваша файловая структура будет выглядеть примерно так:

project-root-dir
├── public
│  └── index.php
├── vendor/
├── lib/
│  └── foobar/
│     └── some files ...
│     └── src/
├── composer.json
├── composer.lock

Теперь вам нужно проверить * 1018 пакета *, в частности, раздел autoload. Это может быть что-то вроде:

"autoload": {
        "psr-4": { "Funtastic\\FooBar\\": "src" }
    }

Теперь вам нужно go до * вашего приложения, найти раздел autoload и отредактировать его, включив в него Funtastic\FooBar пространство имен. Предполагая, что у вас уже есть пространство имен App:

  "autoload": {
    "psr-4": {
      "App\\": "src/",
      "Funtastic\\FooBar\\": "lib/foobar/src"
    }

Кроме того, вам также необходимо проверить раздел require исходного пакета и посмотреть, зависит ли он от какого-либо пакета, и добавить эти пакеты в приложение. Раздел "require" в его composer.json.

Имея все это на месте и правильно отредактировав composer.json, вы можете просто восстановить автозагрузчик (composer dump-autload), и вы будете готовы к go.

Очевидно, что поскольку я не знаю специфики вашего пакета и проекта, вам придется адаптировать эти инструкции к вашему конкретному случаю c, но это не займет много времени, чтобы пакет работал внутри ваше приложение.


В качестве альтернативы, если вы хотите продолжить обрабатывать этот пакет, как если бы он был "внешней" зависимостью:

  1. Сжать все файлы пакета в package.zip и поместите его в base_dir/lib
  2. Добавьте следующее к вашему composer. json:
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "vendor/name",
                "version": "1.0",
                "dist": {
                    "url": "lib/package.zip",
                    "type": "zip"
                }
            }
        }
    ],
    
    (Решение, изначально предложенное самим автором вопроса).

С T Его файлы будут существовать дважды в вашем проекте: как «хранилище» и установлены на vendor, что я считаю менее чем идеальным. Вы также можете хранить файлы за пределами вашего проекта, но это потребует дополнительного отслеживания.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...