Общая информация о том как сформировать проект для разработки на Odoo

  1. Базовая настройка odoo происходит для системы debian (безусловно можно запустить odoo нативно на любой платформе, но сами разработчики выбрали для себя именно debian)
  2. Для запуска odoo на других операционных системах мы будем использовать Docker
  3. Для запуска в рамках системы контейнеризации Docker мы будем использовать для Windows или MacOS DockerDesktop. Поскольку технология контейнеризации принадлежит исключительно к Linux системе, то для того, чтобы Docker бесшовно работал на других ОС в его состав входит механизм запуска виртуальной машины с Linux в внутри которой и запускается контейнер.
  4. Конфигурирование проекта для разработки на odoo является достаточно не тривиальной задачей как для новичка, так и представляет множество возможностей совершить ошибку по невнимательности уже опытному разработчику

Из чего состоит проект для разработки на odoo:

Под проектом разработки на odoo я подразумеваю каталог, открыв который в VSCode мы сможем вести нормальную разработку:

  • получим доступ ко всем необходимым файлам
  • будем иметь возможность запускать и останавливать процесс с разрабатываемым приложением
  • производить отладку системы как с помощью отладчика так и с помощью нестареющей классики print().

Чтобы соблюсти все эти условия нам необходимо проделать следующие действия:

  • в первую очередь мы должны подключить к проекту каталог с исходными текстами самой odoo. У себя в хостовой системе я делаю клон всего репозитория и символьную ссылку от ее реального расположения в каталог своего текущего проекта, плюс мы должны пробросить этот же каталог в контейнер.
  • если у нас есть проекты, от которых зависит наш разрабатываемый проект, то нам нужно склонировать на свой компьютер нужные репозитории и так же сделать символьные ссылки из нашего проекта на эти каталоги (может возникнуть ситуация что мы вынуждены будет лезть туда отладчиком), плюс мы должны пробросить все эти каталоги во внутрь контейнера.
  • в третью очередь нам нужно подключить к проекту каталог с текущим разрабатываемым проектом, который представляет собой отдельный git репозиторий с модулями для odoo, или даже может содержать несколько каталогов с модулями. Мы точно так же делаем мягкую ссылку от каталога с репозиторием в наш проект. Точно так же делаем проброс каталога с этим репозиторием во внутрь контейнера

Для того, чтобы быстро переключаться между проектами я использую возможности git, где каждый коммит или ветка являют собой состояние файловой системы проекта на момент создания коммита. Т.е. если мне надо подключить к проекту odoo версии 16.0, то мне достаточно переключиться на соответствующую ветку

git checkout 16.0

Такой подход так же работает при использовании других проектов для odoo. Например в репозитории OCA точно так же модули которые имеют отношение к конкретной версии находятся в соответствующей ветке. Да и вообще это уже стандарт де факто при публикации своих модулей. Поэтому используя другие модули, переключение ветки git так же работает Исходя из вышеизложенного я сделал следующие каталоги в домашней директории:

/home/user/odoo_projects - каталог с проектами модулей odoo
/home/user/odoo_projects/github.com/aayartsev/odoo_demo_project - в этом же каталоге для каждого сервиса, 
автора и репозитория создается свой подкаталог, чтобы различные проекты не могли пересекаться по имени
/home/user/odoo_projects/github/OCA/manufacture - например если в зависимостях есть модуль manufacture

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

/home/user/projects/odoo_demo_project-16

В конце всех этих мероприятий у нас должен получится каталог с проектом внутрь которого проброшены в виде мягких ссылок следующие каталоги git репозиториев:

  • каталог с самой платформой odoo
  • каталог с проектом, который мы сейчас разрабатываем
  • каталоги проектов от которых зависит наш текущий разрабатываемый проект от сторонних разработчиков Созданы следующие файлы и каталоги внутри проекта
  • файл конфигурации системы
  • каталог с файлами окружения, куда будут устанавливаться python пакеты для нашего проекта
  • каталог для хранения статических ресурсов odoo и системы pre-commit, это нужно для того, чтобы между перезапусками системы данные не исчезали, т.к. контейнер всегда запускается с состоянием файловой системы образа

И эти же каталоги и файл конфигурации у нас должны быть прописаны в docker-compose.yml для их проброса внутрь контейнера. Таким образом мы добились того, что для нас в редакторе кода и внутри контейнера доступны одни и те же ресурсы. Теперь, для того чтобы нам запустить процесс odoo внутри контейнера нужно соблюсти следующие условия:

  • При запуске процесса надо указать путь к конфигурационному файлу, причем путь к нему должен указываться относительно файловой системы контейнера. Т.е. мы должны создать его в своем каталоге с проектом, прописать проброс его внутрь контейнера в файле docker-compose.yml

  • Внутри файла конфигурации должны быть прописаны пути ко всем каталогам с модулями, пути тоже должны быть написаны относительно файловой системы контейнера. Обратите внимание, что внутри каталога с проектом odoo есть аж два каталога с названием addons и они оба должны быть указаны в файле конфигурации

  • Все проекты должны быть переключены на ветку с одинаковой версией, т.е. перед запуском проекта мы должны убедиться что, если мы разрабатываем проект для версии 14 то odoo и проекты от которых зависит наш разрабатываемый проект должны быть переключены на ветку 16.0. Это связано с тем, что по сложившейся традиции проект может содержать в себе модули для разных версий, где каждая версия находится в отдельной ветке и имеет название НОМЕР_ВЕРСИИ.0, например 8.0, 12.0, 14.0 и т.д.

  • Ваш текущий разрабатываемый проект должен находиться в нужной вам в текущий момент ветке Если все эти условия выполнены то процесс odoo запущенный внутри контейнера правильно найдет все пути к модулям и запустится без ошибок.

  • Все каталоги с кодом, так же должны быть прописаны в файле ./.vscode/launch.json, примерно следующим образом:

{
    "configurations": [
        {
        "name": "Odoo: Remote Attach",
        "type": "python",
        "request": "attach",
        "port": 5678,
        "host": "localhost",
        "pathMappings": [
            {
                "localRoot": "${workspaceFolder}/odoo_demo_project",
                "remoteRoot": "/home/odoo/extra-addons/odoo_demo_project"
            },
            {
                "localRoot": "${workspaceFolder}/odoo",
                "remoteRoot": "/home/odoo/odoo"
            }
        ]
        }
    ]
}

Подводя итог - мы собрали проект таким образом чтобы одни и те же файлы, которые мы видим в своем редакторе кода, видны внутри контейнера и мы запускаем целевой процесс в изолированном стандартном окржужении. Работа с git проиходит в хостовой системе, и VSCode спокойно видит все репозитории внутри проекта и можно использовать его инструментарий.

Дополнительная фишка такого подхода - это использование одних и тех же git репозиториев в различных проектах для разных версий odoo.

Финальный вид должен быть примерно таким:

Финальный результат

Обсуждение

Обсудить, указать на ошибки и опечатки можно здесь