Сконфигурируйте зависимость Composer для использования path для source и git для dist - PullRequest
0 голосов
/ 20 июня 2019

У меня есть проект, который использует другой мой проект GitHub в качестве зависимости. У меня есть два требования к конфигурации Composer для этой зависимости:

  • Когда я работаю локально, мне нужна символическая ссылка от composer install --prefer-source до на мою локальную копию зависимости , чтобы я мог запускать git команды внутри зависимости.
  • Когда мой процесс сборки запущен, мне нужно composer install --prefer-dist для установки напрямую из репозитория GitHub без символьных ссылок.

Ранее я использовал следующее внутри composer.json, чтобы выполнить первое требование:

  "require": {
    "narthur/natlib": "@dev"
  },
  "repositories": [
    {
      "type": "path",
      "url": "../natlib",
      "options": {
        "symlink": true
      }
    }
  ]

После некоторой работы, я придумал это, которому удается удовлетворить второе требование:

  "require": {
    "narthur/natlib": "@dev"
  },
  "repositories": [
    {
      "type": "package",
      "package": {
        "name": "narthur/natlib",
        "version": "2019.06.20",
        "dist": {
          "type": "zip",
          "url": "https://github.com/narthur/natlib/archive/master.zip"
        },
        "source": {
          "type": "path",
          "url": "../natlib",
          "reference": "master",
          "options": {
            "symlink": true
          }
        }
      }
    }
  ]

Это отлично работает в CI. Но когда я удаляю свой локальный файл vendor/ dir и composer.lock и запускаю composer install --prefer-source, я получаю следующее исключение:

[LogicException]
Загрузчик "Composer \ Downloader \ PathDownloader" является загрузчиком типа dist и не может использоваться для загрузки исходного кода пакета narthur / natlib-2019.06.20.0

Я попытался разделить их на две записи в репозитории, например:

{
  "type": "path",
  "url": "../natlib",
  "options": {
    "symlink": true
  }
},
{
  "type": "package",
  "package": {
    "name": "narthur/natlib",
    "version": "2019.06.20",
    "dist": {
      "type": "zip",
      "url": "https://github.com/narthur/natlib/archive/master.zip"
    }
  }
}

Это работает локально, символизирует зависимость, но завершается ошибкой в ​​CI, , потому что Composer останавливается на первой соответствующей записи репозитория :

Здесь важен порядок. При поиске пакета Composer будет искать от первого до последнего хранилища и выбирать первое совпадение.

Как настроить Composer так, чтобы он вел себя так, как я хочу, чтобы локально флаг --prefer-source символически связывал зависимость, а в CI флаг --prefer-dist будет извлекать хранилище?

Информация, которую я нашел:

1 Ответ

0 голосов
/ 21 июня 2019

Я понял, что мои требования, вероятно, не нужны. Поскольку моя зависимость размещена на GitHub, я могу использовать ее локально и удаленно, а также вносить изменения в зависимость внутри папки поставщика, оттуда возвращаясь к GitHub.

Вот что я сейчас использую:

  "require": {
    "narthur/natlib": "@dev"
  },
  "repositories": [
    {
      "type": "vcs",
      "url": "https://github.com/narthur/natlib"
    }
  ]

Одна ошибка, с которой я столкнулся, когда делал этот сдвиг, заключалась в том, что я изначально пытался использовать репозиторий типа пакета вместо простого vcs-типа. Это не сработало, потому что заставило Composer игнорировать файл composer.json зависимости, предотвращая его автозагрузку . После перехода к простой записи VCS выше все работает отлично.

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