Модуль 2.3 · Урок 2
Урок 2: Базовая работа с Gemini CLI
Содержание
- Чему вы научитесь
- Архитектура Gemini CLI: инструменты и режимы
- Задача 1: Анализ существующего проекта
- Задача 2: Навигация по кодбейзу
- Инструмент: read_file для анализа
- Задача 3: Генерация кода — добавим новую функцию
- Задача 4: Мультифайловые правки
- Практический пример: анализ большого проекта
- Режимы работы Gemini CLI
- Режим 1: Интерактивный
- Режим 2: Одна команда
- Режим 3: Pipe и stdin
- Инструменты Gemini CLI в деталях
- run_shell_command — выполнение команд
- grep_search — поиск по кодбейзу
- read_file и replace (edit)
- Попробуйте сами
- Практическое задание 1: Анализ собственного проекта
- Практическое задание 2: Генерация с нуля
- Практическое задание 3: Мультифайловые правки
- Диаграмма: как Gemini анализирует проект
- Ключевые выводы
- Следующий урок
Чему вы научитесь
- Анализировать структуру проектов и понимать архитектуру через Gemini
- Генерировать код, создавать новые файлы и функции
- Редактировать множество файлов в одном запросе (мультифайловые правки)
- Использовать встроенные инструменты: shell-команды, чтение файлов, поиск по коду
- Работать с большими проектами благодаря 1M контексту
Архитектура Gemini CLI: инструменты и режимы
Gemini CLI работает с набором встроенных инструментов: run_shell_command, read_file, grep_search, replace (edit), list_directory. Вот как это устроено:
┌──────────────────────────────────────┐
│ Ваш запрос к Gemini │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ Gemini обдумывает запрос │
│ (анализирует контекст) │
└──────────────────────────────────────┘
↓
┌─────────┴─────────┐
↓ ↓
┌──────────────┐ ┌──────────────┐
│ Инструменты │ │ Генерация │
├──────────────┤ ├──────────────┤
│ run_shell_command │ │ Код (Python) │
│ read_file │ │ Код (JS) │
│ grep_search │ │ Файлы │
│ replace (edit) │ │ Тесты │
└──────────────┘ └──────────────┘
↓ ↓
└─────────────┬─────────────┘
↓
Результаты в терминал
Задача 1: Анализ существующего проекта
Начнём с реального примера. Склонируйте небольшой open-source проект:
cd ~/projects
git clone https://github.com/axios/axios.git
cd axios
Размер проекта: ~500 файлов, отличный для тестирования 1M контекста Gemini.
Теперь дайте запрос Gemini:
gemini "Проанализируй структуру этого проекта. Опиши:
1. Основные папки и их назначение
2. Главный файл входа (entry point)
3. Основные модули
4. Как устроена архитектура?"
Ответ будет примерно таким:
axios — это HTTP-клиент на JavaScript.
Структура:
- lib/core/ — основная логика (адаптеры, интерцепторы)
- lib/helpers/ — утилиты (парсинг, форматирование)
- lib/adapters/ — реализации для разных окружений (Node, Browser)
- test/ — тесты
Entry point: index.js → lib/axios.js
Архитектура:
1. Request interceptor → отправка → Response interceptor
2. Поддержка Promise и async/await
3. Модульная система с адаптерами
Задача 2: Навигация по кодбейзу
Вместо чтения файлов вручную, дайте Gemini команду найти код:
gemini "Найди все функции, которые работают с заголовками HTTP.
Используй grep или search. Выведи файлы и строки кода."
Gemini автоматически запустит поиск:
# Что выполнит Gemini в фоне:
grep -r "header" lib/ --include="*.js" | head -20
И выведет результаты с контекстом.
Инструмент: read_file для анализа
Когда нужен полный контекст файла:
gemini "Я хочу понять, как работает Interceptor в axios.
Прочитай lib/core/Interceptor.js полностью и объясни логику пошагово."
Gemini прочитает файл и объяснит код построчно.
Задача 3: Генерация кода — добавим новую функцию
Теперь создайте своё расширение. Запросите:
gemini "Создай новый файл lib/utils/retry.js, который содержит функцию retry().
Функция должна:
- Принимать async функцию и количество попыток
- Повторять вызов при ошибке с экспоненциальной задержкой
- Вернуть результат или ошибку после всех попыток
Используй TypeScript с полными типами.
Добавь JSDoc комментарии.
Включи примеры использования в комментарии."
Gemini создаст файл:
/**
* Повторный вызов функции с экспоненциальной задержкой
* @template T
* @param {() => Promise<T>} fn - Async функция для повтора
* @param {number} maxAttempts - Максимум попыток
* @param {number} initialDelay - Начальная задержка в мс (default: 100)
* @returns {Promise<T>}
*
* @example
* const result = await retry(
* () => fetch('/api/users'),
* 3,
* 100
* );
*/
export async function retry<T>(
fn: () => Promise<T>,
maxAttempts: number = 3,
initialDelay: number = 100
): Promise<T> {
let lastError: Error | null = null;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
lastError = error as Error;
if (attempt < maxAttempts) {
const delay = initialDelay * Math.pow(2, attempt - 1);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
throw lastError;
}
Файл создастся автоматически!
Задача 4: Мультифайловые правки
Это суперсила Gemini CLI — редактировать сразу несколько файлов:
gemini "Добавь функцию retry к axios. Нужно:
1. В lib/axios.js добавь import функции retry из utils/retry.js
2. В lib/core/dispatchRequest.js добавь обработку конфига retry
3. В test/unit/request.test.js напиши 3 теста для retry:
- успешный вызов после первой ошибки
- истощение попыток
- проверка экспоненциальной задержки
Используй существующий стиль кода проекта (var вместо const, 4 пробела).
Дай мне ссылки на все изменения."
Gemini выведет что-то типа:
Изменения готовы!
1. lib/axios.js (добавлены 2 строки)
├─ import retry (строка 5)
└─ export в public API (строка 45)
2. lib/core/dispatchRequest.js (добавлены 8 строк)
├─ config.retry проверка (строка 23)
└─ обёртка в retry (строка 45-50)
3. test/unit/request.test.js (добавлены 45 строк)
├─ Тест 1: retry после первой ошибки [+]
├─ Тест 2: истощение попыток [+]
└─ Тест 3: экспоненциальная задержка [+]
Запусти тесты: npm test
Практический пример: анализ большого проекта
Давайте посмотрим, как Gemini справляется с реальным кодом:
# Находитесь в папке проекта
gemini "Я вижу, что есть баг: при retry истощаются соединения.
Проанализируй все файлы, где используется retry.
Найди, где не закрываются соединения.
Выведи список файлов и номера строк, где нужно добавить cleanup-логику."
Gemini:
- Прочитает все файлы с retry
- Проанализирует управление ресурсами
- Найдёт проблемные строки
- Предложит fix
Режимы работы Gemini CLI
Gemini CLI работает в разных режимах:
Режим 1: Интерактивный
gemini
> Напиши функцию...
< Вывод
> Добавь обработку ошибок
< Вывод
> exit
Плюсы: контекст сохраняется между запросами, удобно дорабатывать Минусы: нужно вводить вручную
Режим 2: Одна команда
gemini "Твой запрос"
Плюсы: быстро, можно автоматизировать в скриптах Минусы: каждый запрос — отдельная сессия
Режим 3: Pipe и stdin
cat requirements.txt | gemini "Создай код на основе этого файла"
Плюсы: интеграция с другими утилитами Минусы: ограничение по размеру stdin
Инструменты Gemini CLI в деталях
run_shell_command — выполнение команд
gemini "Запусти тесты проекта и покажи результаты"
Gemini выполнит npm test или python -m pytest в зависимости от типа проекта.
grep_search — поиск по кодбейзу
gemini "Найди все места, где используется переменная userData"
Использует встроенный поиск (как grep, но умнее).
read_file и replace (edit)
gemini "Читай файл package.json, дай анализ зависимостей"
Полное содержимое файла загружается в контекст для анализа.
Попробуйте сами
Практическое задание 1: Анализ собственного проекта
-
Инициализируйте новый проект или возьмите старый:
mkdir my-analyzer cd my-analyzer git init -
Создайте 3-5 файлов с кодом (может быть простой код):
cat > main.py << 'EOF' def calculate(x, y): return x + y def main(): result = calculate(5, 3) print(result) EOF -
Дайте запрос Gemini:
gemini "Проанализируй мой проект. Что тут находится? Какая архитектура? Предложи улучшения." -
Обратите внимание на то, как Gemini анализирует структуру благодаря большому контексту.
Время: 10 минут
Практическое задание 2: Генерация с нуля
-
Создайте чистую папку:
mkdir weather-api cd weather-api git init -
Дайте большой запрос:
gemini "Создай REST API для погоды на FastAPI. Требования: - GET /weather?city=Moscow - получить погоду - GET /forecast?city=Moscow&days=5 - прогноз на дни - POST /subscribe - подписаться на уведомления - Структура папок: app/ (логика), tests/, config/ - Используй async/await - Добавь примеры .env - Напиши requirements.txt - Напиши README.md с примерами curl Создай все файлы." -
Проверьте, что создались все файлы:
ls -la find . -type f -
Запустите приложение:
pip install -r requirements.txt python main.py
Время: 20-25 минут
Практическое задание 3: Мультифайловые правки
-
Возьмите проект из задания 2
-
Запросите улучшения:
gemini "Добавь следующие фичи ко всему проекту: 1. Логирование всех запросов (используй loguru) 2. Кеширование результатов на 1 час (Redis) 3. Обработка ошибок с custom исключениями 4. Тесты с pytest и fixtures 5. Docker файл для запуска Обнови все существующие файлы. Создай новые файлы для логики кеша и исключений. Выведи список всех изменений." -
Просмотрите изменения:
git diff git status
Время: 15-20 минут
Диаграмма: как Gemini анализирует проект
graph TD
A["Запрос: Проанализируй проект"] -->|читает GEMINI.md| B["Контекст: стиль кода, цели"]
B -->|список файлов| C["find . -type f"]
C -->|выбирает важные файлы| D["Анализирует архитектуру"]
D -->|ищет паттерны| E["Находит зависимости"]
E -->|строит граф| F["Выводит результат"]
style A fill:#e1f5ff
style D fill:#c8e6c9
style F fill:#fff9c4
Ключевые выводы
- Gemini CLI использует инструменты: run_shell_command, read_file, grep_search, replace (edit), list_directory для работы с кодом
- 1M контекст позволяет анализировать большие проекты целиком без разбиения на части
- Мультифайловые правки экономят время: один запрос — множество файлов обновлено
- Интерактивный режим удобен для итеративной разработки с уточнениями
- Автоматизация через pipe позволяет встраивать Gemini в скрипты и CI/CD
Следующий урок
→ Урок 3: Когда Gemini CLI лучше, чем Claude Code
В следующем уроке вы узнаете, когда использовать Gemini CLI, а когда Claude Code, и как комбинировать оба инструмента для максимальной продуктивности.