Структура каталогов для 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 автозагрузка, это действительно не имеет большого значения в вашей структуре каталогов, ее можно легко изменить в любое время, не влияя на ваш код. Итак, экспериментируйте и посмотрите, что вам нравится.