Каким образом следует структурировать репозитории на Python?

Здравствуйте! Мне нужно разобраться, как оптимально организовать свои репозитории. У меня есть три репозитория, назовем их A, B и C, которые находятся в одной папке и прописаны в PYTHONPATH. Это решение выглядит несколько неудобным. 

Репозиторий A является основным, и я отвечаю за него, хотя изначально его создал другой человек. В данном репозитории я пишу автотесты с использованием pytest, и в файл conftest.py я импортирую фикстуры из репозиториев B и C следующим образом: 
<pre><code class="python">from B.fixtures import *  # noqa: F403
from C.conftest import *  # noqa: F403</code></pre> 

Я пробовал добавить репозитории B и C как Git submodule в репозиторий A, но столкнулся с проблемами импорта внутри репозитория C. Есть ли какие-то более элегантные решения для этой ситуации? Буду признателен за любые советы. Спасибо!
  • 24 января 2025 г. 15:24
Ответы на вопрос 2
Здравствуйте! Структурирование репозиториев на Python действительно может быть сложной задачей, особенно когда вы имеете дело с несколькими модулями, которые зависят друг от друга. Ваша ситуация с репозиториями A, B и C предполагает, что вам необходимо организовать их так, чтобы минимизировать проблемы с импортом и упростить работу с тестами. Вот несколько рекомендаций, которые могут помочь:

### 1. Использование виртуального окружения

Первое, что стоит сделать — это убедиться, что вы работаете в отдельном виртуальном окружении (например, venv или conda), что позволит вам управлять зависимостями и пакетами для каждого проекта отдельно.

### 2. Организация пакетов

Каждый из ваших репозиториев должен быть самостоятельным Python-пакетом. Это означает, что у вас должен быть файл `setup.py` (или `pyproject.toml`) в каждом репозитории, чтобы можно было их устанавливать и импортировать как пакеты. Структура каждого репозитория может быть следующей:

```
A/
    ├── setup.py
    ├── src/
    ├── tests/
    └── requirements.txt

B/
    ├── setup.py
    ├── src/
    └── requirements.txt

C/
    ├── setup.py
    ├── src/
    └── requirements.txt
```

### 3. Установка зависимостей

Вместо того чтобы добавлять репозитории B и C в PYTHONPATH, вы можете установить их в ваше виртуальное окружение. Например, вы можете использовать `pip` для установки локальных пакетов:

```bash
pip install -e /path/to/B
pip install -e /path/to/C
```

Это создаст символические ссылки на ваш код и позволит вам импортировать их как обычные модули:

```python
from B import fixtures
from C import conftest
```

### 4. Упрощение импорта в тестах

Теперь, когда B и C установлены в ваше виртуальное окружение, вы можете импортировать фикстуры в `conftest.py` без проблем:

```python
from B.fixtures import *
from C.conftest import *
```

### 5. Использование Git Submodules

Если вы предпочитаете оставить репозитории B и C как подмодули в A, вы можете использовать `poetry` или аналогичные инструменты для управления зависимостями. Убедитесь, что вы добавили правильные пути в `pyproject.toml`.

### 6. CI/CD и тестирование

Если ваш проект предполагает использование CI/CD, убедитесь, что система сборки корректно настраивает ваше окружение и устанавливает все необходимые зависимости перед запуском тестов.

### Заключение

Описанные подходы помогут вам организовать ваши репозитории таким образом, чтобы избежать проблем с импортом и сделать ваш код более чистым и понятным. Главное — обеспечить независимость модулей и отсутствие циклических зависимостей, что упростит дальнейшую поддержку кода.
Как организовать для чего? В чем смысл наличия 3 репозиториев и почему тесты одного, влияют на тесты другого? 

Можете ли вы, что-то посоветовать?
Взять ручку, бумагу и нарисовать граф зависимостей. Затем нарисовать чего вы хотите добиться и сравнить.
Общий код реализуйте как библиотеку и переиспользуйте. Если ее по ходу тоже нужно редактировать, использовать pip install -e . Ничего из чужих тестов не импортировать. Со звёздочкой вообще никогда не импортировать.
Похожие вопросы