Один общий поставщик с двумя проектами

4

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

Итак, моя структура будет примерно такой:

project1/
project2/
shared_vendor/

Я читал об этом. Я изменил переменную загрузчика app/autoload.php:

$loader = require __DIR__.'/../vendor/autoload.php';

в

$loader = require __DIR__.'/../../vendor/autoload.php';

И я также изменил vendor-dir в моей composer.json на:

    "config": {
      "bin-dir": "bin",
      "vendor-dir": "vendor"
    },

в

    "config": {
      "bin-dir": "bin",
      "vendor-dir": "/../vendor"
    },

И после этого я получаю эту ошибку:

ClassNotFoundException in AppKernel.php line 20: Attempted to load 
class "CmsUserBundle" from namespace "Cms\UserBundle".
Did you forget a "use" statement for another namespace?

Что я делаю неправильно? Я забыл что-то изменить? Спасибо заранее.

  • 0
    CmsUserBundle живет в project_1/src/ или в shared_vendor/ ?
  • 0
    Вам не хватает вручную редактировать конфигурацию автозагрузки композитора, которая загружает пространства имен проекта.
Показать ещё 9 комментариев
Теги:
composer-php
autoload
vendor

2 ответа

5
Лучший ответ

Композитор работает на основе каждого проекта.

Один проект - одна папка поставщика. Нет, два проекта и одна "общая" папка поставщика.

У нас был "общий" подход к папке поставщиков с PEAR достаточно долго, и это просто не получилось. Большую роль играет управление различными требованиями к проекту с глобальной папкой поставщика, поскольку каждый проект имеет разные требования.

В любом случае...

если вам нравится настройка "shared vendor folder", я бы предложил создать что-то вроде "обертки" или "супер" проекта, который действует как контейнерный репозиторий для двух других проектов. Проект оболочки будет содержать файл composer.json с требованиями для обоих (!) Проектов. Это означает, что вы работаете с одним и тем же набором зависимостей в обоих подпроектах.

Это позволяет определить требования для обоих подпроектов (cms и shop) в "обертке" репо. В принципе, я предлагаю следующую структуру:

|-container-project
  +-CMS
    |-src
    +-tests
  +-Shop
    |-src
    +-tests
  +-vendors      // contains dependencies for both projects (CMS + Shop)
|-composer.json  // define requirements for both projects

Эта настройка позволяет вводить файлы composer.json для подпроектов. Вам просто нужно передать требования из файла composer.json суперпроекта в файл composer.json подпроекта.

Теперь также можно настроить поведение автозагрузок подпроектов, зарегистрировав автозагрузчики в определенном порядке.

  • 1
    Хорошо, спасибо за объяснение. Я буду использовать одного поставщика для одного проекта, как вы все написали. :)
0

В соответствии с вашими требованиями, и если единственное, что вам нужно/нужно разделить между несколькими проектами, это каталог поставщика, вы можете просто создавать символические ссылки в каждом проекте, кроме основного, у которого уже есть каталог поставщика.

Например:

cd /var/www/SiteA
composer install
# git clone new project into /var/www/SiteB
cd ../SiteB
# If vendor directory is already there, delete it: rm -rf vendor
# create symlink to Site A vendor directory
ln -s /var/www/SiteA/vendor

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню