Структура каталогов для PHP-сайта с использованием композитора, gulp и Travis

Я пытаюсь выяснить структуру каталогов для веб-сайта php.

Веб-сайт будет использовать:

  • очень простая фреймворческая структура MVC (а именно MinimalMVC, но я ищу универсальное решение, поэтому структура может, вероятно, игнорироваться)
  • композитор для управления зависимостями PHP
  • SCSS для стилизации
  • gulp для компиляции SCSS (для сборки dev), а также для минимизации и конкатенации вывода JS и CSS, а также для минимизации изображений и т.д. (только для сборки развертывания).
  • Travis CI для материалов CI

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

  • gulp deploy должен иметь возможность создавать папку развертывания, которая при вводе в каталог /var/www/html/ на сервере Apache должна работать Just Work TM

    Примечание: MinimalMVC (а также CodeIgniter и другие аналогичные структуры) требуют своего файла index.php в корневом каталоге с папкой app и sys в том же каталоге

  • Поскольку PHP никогда не обрабатывается процессом сборки, было бы здорово, если бы ненужное копирование файлов src/**/*.php во что-то вроде build/**/*.php было бы невозможно. В принципе, часть PHP не поддерживает gulp, я бы предпочел, чтобы она осталась без изменений gulp.

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

Идея:

.
|-- composer.json
|-- gulpfile.js
|-- package.json
|-- src
|   |-- app
|   |   |-- controllers
|   |   |-- models
|   |   `-- <other_framework_stuff>
|   |-- assets
|   |   |-- css
|   |   |-- img
|   |   |-- js
|   |   `-- raw
|   |       `-- scss
|   |-- index.php
|   `-- sys
|       `-- <framework_stuff>
|-- test
`-- vendor
    `-- <composer_stuff>

В этой структуре разработчики работают только в каталоге /src. SCSS скомпилируется из /src/assets/raw/scss/ в src/assets/css. Таким образом, PHP остается удаленным из процесса сборки. При попытке сгенерировать каталог deploy папка src будет скопирована, каталог /src/assets/raw/ (поэтому no /build/assets/raw) не существует, а готовые/развертываемые CSS, JS и изображения находятся в /build/assets/.

Первая проблема с этим решением - это странный каталог src/assets/raw, который кажется уродливым imho. Вторая проблема - это каталог /vendor. Это означает, что php ссылается на материал извне src. Поэтому, если /src/index.php заботится об этом, он будет включать ../vendor/autoload.php. Тогда это означало бы, что один и тот же код будет скопирован в /build/index.php. И тогда /build/ не будет запущен, просто отбросив его в /var/www/html, если только vendor не находится в /var/www, что кажется странным.

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

Помогите, пожалуйста. Должен ли я просто положить vendor в /src/ с помощью vendor-dir в composer.json? (Я знаю, eww.) Какую структуру каталогов я должен использовать?

Ответ 1

Я согласен с комментарием Корри выше, поскольку вы можете извлечь выгоду из вдохновения из существующих рамок.

Лично мне нравится такая структура каталогов.

.
|-- composer.json
|-- gulpfile.js
|-- package.json
|-- changelog.md
|-- readme.md
|-- /src (This is the API code that *I'm* responsible for, and that I *own*.).
|   |-- /app
|   |   |-- /controllers
|   |   |-- /models
|   |   `-- <other_framework_stuff>
|   /public (Keeping this outside of the src dir, means that you can give this to your front-end devs without needing to have the entire codebase).
|   |   |-- /styles
|   |   |-- /images
|   |   |-- /js
|   /config (Put all configuration files outside of the src scope, so you can keep it outside of source control)
|   /build (CI build related configuration)
|   |   |--phpcs.xml
|   |   |--phpdocx.xml
|-- /tests (separating out your tests in this way can help you run tests separately, more easily)
|   |   |--acceptance
|   |   |--integration
|   |   |--unit
|-- /vendor (Depenedencies installed via Composer)

На самом деле, нет правильного ответа сообщества на ваш вопрос. Правильный ответ специфичен для вашего бизнеса, команды, в которой вы работаете, и самого проекта.

Я никогда не ставил каталог /vendor в ваш каталог /src - потому что вы его не владеете. Вы не несете ответственности за изменения кода в зависимостях проекта, поэтому его следует оставлять в своей области вне стен проектов.

С PSR-4 автозагрузка, это действительно не имеет большого значения в вашей структуре каталогов, ее можно легко изменить в любое время, не влияя на ваш код. Итак, экспериментируйте и посмотрите, что вам нравится.