<!-- Bothost docs | HTML: https://bothost.ru/docs/installing-libraries | Markdown: https://bothost.ru/docs/installing-libraries.md | Index: https://bothost.ru/llms.txt -->

# Установка библиотек: Python, Java и Go

На платформе Bothost боты собираются в Docker-контейнерах. Зависимости устанавливаются автоматически при сборке образа, если в репозитории есть стандартные файлы зависимостей. В этом руководстве описано, как добавить библиотеки для проектов на **Python**, **Java** и **Go**.

---

## Python

### Файлы зависимостей

Платформа распознаёт следующие файлы:

| Файл | Описание |
|------|----------|
| `requirements.txt` | Список пакетов pip (основной способ) |
| `pyproject.toml` | Современный формат (PEP 518), поддерживается для определения версии Python и зависимостей |

### requirements.txt

Добавьте в **корень репозитория** файл `requirements.txt`. При сборке выполняется:

```bash
pip install --no-cache-dir -r requirements.txt
```

**Пример `requirements.txt`:**

```text
aiogram>=3.0.0
aiohttp
python-dotenv
```

С указанием версий (рекомендуется для стабильной сборки):

```text
aiogram==3.2.0
aiohttp==3.9.0
python-dotenv==1.0.0
```

### pyproject.toml

Для проектов с `pyproject.toml` укажите зависимости в секции `[project]`:

```toml
[project]
name = "my-bot"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
    "aiogram>=3.0.0",
    "aiohttp",
    "python-dotenv",
]
```

Платформа может определять версию Python из `requires-python` и устанавливать пакеты через `pip install .` или `pip install -e .` при наличии соответствующего Dockerfile.

### Рекомендации для Python

- Храните `requirements.txt` или `pyproject.toml` в корне репозитория.
- Фиксируйте версии в продакшене (`package==1.2.3`), чтобы сборки были воспроизводимы.
- Не коммитьте виртуальное окружение (папки `venv`, `.venv`) в Git.

---

## Java

Для Java-ботов зависимости задаются через **Maven** (`pom.xml`) или **Gradle** (`build.gradle` / `build.gradle.kts`). Сборка выполняется внутри Docker-образа.

### Maven (pom.xml)

Добавьте в корень проекта файл `pom.xml` с зависимостями в `<dependencies>`:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>ru.example</groupId>
    <artifactId>telegram-bot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Telegram Bot API -->
        <dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>6.8.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>ru.example.BotMain</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
```

При сборке образа обычно выполняется:

```bash
mvn clean package -DskipTests
```

Исполняемый JAR будет в `target/*.jar`. В Dockerfile команда запуска указывает на этот JAR.

### Gradle (build.gradle)

Пример `build.gradle` (Kotlin DSL — `build.gradle.kts`):

```groovy
plugins {
    id 'java'
    id 'application'
}

group = 'ru.example'
version = '1.0-SNAPSHOT'

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.telegram:telegrambots:6.8.0'
}

application {
    mainClass = 'ru.example.BotMain'
}

jar {
    manifest {
        attributes 'Main-Class': 'ru.example.BotMain'
    }
}
```

При сборке:

```bash
./gradlew build
# или для fat JAR:
./gradlew shadowJar   # при использовании плагина shadow
```

### Рекомендации для Java

- Держите `pom.xml` или `build.gradle` в корне репозитория.
- Указывайте конкретные версии зависимостей для предсказуемых сборок.
- В Dockerfile используйте образ с Maven или Gradle, либо многоэтапную сборку (build stage → runtime stage с JRE).

---

## Go

Зависимости в Go описываются в **go.mod** (и при необходимости в **go.sum**). Модуль должен находиться в корне репозитория.

### go.mod

Инициализация модуля (если ещё нет `go.mod`):

```bash
go mod init github.com/username/my-bot
```

**Пример `go.mod`:**

```go
module github.com/username/telegram-bot

go 1.21

require (
    github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
)
```

После добавления импортов в код выполните:

```bash
go mod tidy
```

Это обновит `go.mod` и создаст/обновит `go.sum`.

### Сборка в Docker

Типичные шаги в Dockerfile для Go:

```dockerfile
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /bot .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /bot .
CMD ["./bot"]
```

Платформа может определять версию Go по директиве `go` в `go.mod` и использовать её при сборке образа.

### Рекомендации для Go

- Храните `go.mod` и `go.sum` в корне репозитория и коммитьте оба файла.
- Используйте `go mod tidy` перед коммитом, чтобы зависимости были согласованы.
- Для минимального образа используйте многоэтапную сборку и статическую линковку (`CGO_ENABLED=0`).

---

## Краткая сводка

| Язык  | Файл зависимостей     | Команда установки / сборки        |
|-------|------------------------|-----------------------------------|
| Python| `requirements.txt`    | `pip install -r requirements.txt` |
| Python| `pyproject.toml`      | Зависит от Dockerfile (pip/poetry)|
| Java  | `pom.xml` (Maven)     | `mvn clean package`               |
| Java  | `build.gradle` (Gradle)| `./gradlew build`                |
| Go    | `go.mod` + `go.sum`   | `go mod download && go build`     |

Убедитесь, что выбранный файл зависимостей лежит в корне репозитория и закоммичен в Git — тогда при деплое на Bothost зависимости будут установлены или собраны в рамках сборки Docker-образа.

---

## См. также

- [Быстрый старт](getting-started) — создание первого бота
- [Кастомный Dockerfile](custom-dockerfile) — ручная настройка сборки и запуска
- [Переменные окружения](environment-variables) — передача токенов и настроек
- [FAQ](faq) — частые вопросы по деплою
