Развертывание только сгенерированного кода без файла composer.json и с «vendor» внутри каталога «src» - PullRequest
2 голосов
/ 22 сентября 2019

У меня есть проект со всеми composer.json, phpunit.xml и т. Д. В корневом каталоге проекта.

Все .php источники находятся в src/

Я настроил composer.json следующим образом:

{
  "name" : "myproj",
  "config" : {
    "vendor-dir" : "src/vendor"
  },
  "autoload" : {
    "psr-4" : {
      "myclasses\\" : "src/classes"
    }
  }
}

Это прекрасно работает на моем компьютере разработчика.

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

К сожалению, автозагрузчик ищет классы в /var/www/test/vendor/composer/../../../src/classes/ вместо, например, /var/www/test/vendor/composer/../../classes/

Предупреждение PHP: include (): Не удалось открыть '/ var / www / test / vendor/composer/../../../src/classes/myclasses/core/messages/MessageList.php 'для включения (include_path ='.: / usr / share / php ') в / var / www / test /vendor / composer / ClassLoader.php в строке 444

Есть ли какая-нибудь умная конфигурация, которую я могу сделать?Или я вынужден переместить composer.json (который я считаю метаданными, которые не нужны для производства) в /src?

1 Ответ

2 голосов
/ 22 сентября 2019

Файл composer.json, который никогда не используется во время выполнения.В любом случае, он не используется, он используется только командой composer.Если вы не запускаете composer на своем рабочем компьютере, вам не нужно загружать его.

Ваш проект не терпит неудачу, потому что «вы не развертываете composer.json» с кодом, а потому, что вывыгрузите автозагрузчик, имеющий определенную структуру, которую вы на самом деле упоминаете в своей конфигурации composer.json, а затем попытаетесь запустить сервер с другой структурой каталогов.

При запуске composer installи composer dumpautoloader ваш проект выглядит следующим образом:

composer.json
src/ <--- this is where autoloader looks for your files.
--- yourCode/
--- moreCode/
--- vendor/
------ autoloader.php

Но тогда на вашем сервере вы на своем сервере получаете

yourCode/
moreCode/
vendor/
--- autoload.php <--- this can't find the 'src' directory

Решение не в том, чтобы загружать содержимое вашего каталога src, но сам каталог src.

Любой другой сценарий, которому необходимо использовать автозагрузчик и остальную часть кода, должен просто включать /var/www/test/src/vendor/autoload.php, и все будет работать какэто должно быть.

Если вы не хотите, чтобы каталог src находился внутри test, то его не должно быть при генерации автозагрузчика.Не делайте вашу среду разработки и промежуточную среду отличной от вашей рабочей среды.

Единственная альтернатива, которую вы можете сделать на сборочной машине:

  • run composer install
  • переместить composer.json в src
  • изменить composer.json, поэтому пути, объявленные в ключе autoload, не включают src
  • run composer dumpautoload
  • удалить composer.json
  • загрузить src содержимое.

Работа не гарантируется и это хрупкое решение, но проблема в том, что вы пытаетесь использовать инструмент вспособ, который противоречит конструкции инструмента.

...