Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Dependencies — явные зависимости
dependencies

Dependencies — явные зависимости

Явное объявление и изоляция всех зависимостей приложения

Dependencies: Явные зависимости

Явное объявление и изоляция всех зависимостей приложения

#Суть принципа

Dependencies — второй фактор 12-Factor App. Принцип гласит:

Все зависимости приложения должны быть явно объявлены в файле зависимостей. Никаких неявных зависимостей «это уже установлено на сервере».

✅ Правильно:
# requirements.txt (Python)
flask==3.0.0
requests==2.31.0
psycopg2==2.9.9

# package.json (Node.js)
{
  "dependencies": {
    "express": "^4.18.0",
    "pg": "^8.11.0"
  }
}

# Gemfile (Ruby)
gem 'rails', '7.1.0'
gem 'pg', '1.5.4'

#Почему явные зависимости?

#Проблема: неявные зависимости

Представьте приложение, которое работает на машине разработчика, но падает на сервере:

# app.py import requests # ← У разработчика установлен import flask # ← У разработчика установлен @app.route('/') def index(): return 'Hello'

На машине разработчика:

# Установлено глобально через pip install pip install requests pip install flask python app.py # ✅ Работает

На сервере:

# Зависимости не установлены python app.py # ❌ ModuleNotFoundError: No module named 'requests'

Проблемы неявных зависимостей:

  1. Не работает на новом окружении — нужно вручную устанавливать пакеты
  2. Версии могут отличаться — на сервере Python 3.9, локально 3.12
  3. Непонятно, что требуется — через полгода никто не вспомнит, какие пакеты нужны
  4. Конфликты версий — обновление одного пакета ломает другой

#Решение: явное объявление

# requirements.txt flask==3.0.0 requests==2.31.0 psycopg2==2.9.9 # Установка всех зависимостей одной командой pip install -r requirements.txt

Преимущества:

  • ✅ Новое окружение: git clone && pip install -r requirements.txt && python app.py
  • ✅ Точно известные версии всех пакетов
  • ✅ Воспроизводимость на любом сервере
  • ✅ Легко обновлять зависимости централизованно

#Файлы зависимостей для разных языков

#Python

# requirements.txt # Точные версии для воспроизводимости flask==3.0.0 requests==2.31.0 gunicorn==21.2.0 psycopg2-binary==2.9.9 # Или с указанием минимальной версии flask>=3.0.0 requests>=2.31.0 # Или диапазон версий flask>=3.0.0,<4.0.0
# pyproject.toml (современный стандарт) [project] name = "myapp" version = "1.0.0" dependencies = [ "flask>=3.0.0", "requests>=2.31.0", "gunicorn>=21.2.0", ] [project.optional-dependencies] dev = [ "pytest>=7.4.0", "black>=23.0.0", ]

#Node.js

// package.json { "name": "myapp", "version": "1.0.0", "dependencies": { "express": "^4.18.2", "pg": "^8.11.3" }, "devDependencies": { "jest": "^29.7.0", "eslint": "^8.56.0" } }
# Установка зависимостей npm install # Установить из package.json npm install pkg # Добавить новую зависимость

#Ruby

# Gemfile source 'https://rubygems.org' ruby '3.2.2' gem 'rails', '7.1.0' gem 'pg', '1.5.4' gem 'puma', '6.4.0' group :development, :test do gem 'rspec-rails', '6.1.0' gem 'rubocop', '1.60.0' end
# Установка зависимостей bundle install

#Go

// go.mod module github.com/company/myapp go 1.21 require ( github.com/gin-gonic/gin v1.9.1 github.com/lib/pq v1.10.9 )
# Установка зависимостей go mod download go mod tidy

#PHP

// composer.json { "require": { "php": ">=8.2", "laravel/framework": "^10.0", "doctrine/dbal": "^3.7" }, "require-dev": { "phpunit/phpunit": "^10.5" } }
# Установка зависимостей composer install

#Изоляция зависимостей

#Проблема: глобальные пакеты

# ❌ Неправильно: установка глобально pip install flask pip install requests # Конфликт версий между проектами: # Проект A требует flask==2.0.0 # Проект B требует flask==3.0.0 # ❌ Невозможно установить одновременно

#Решение: виртуальные окружения

#Python: venv

# Создание виртуального окружения python -m venv venv # Активация (Linux/macOS) source venv/bin/activate # Активация (Windows) venv\Scripts\activate # Установка зависимостей в изолированное окружение pip install -r requirements.txt # Проверка: пакеты установлены только в venv which python # /path/to/project/venv/bin/python

#Node.js: node_modules

# Node.js автоматически изолирует зависимости npm install # Пакеты устанавливаются в локальную папку ls node_modules/ # express, pg, ... # Использование в коде const express = require('express'); # Берётся из node_modules

#Ruby: Bundler

# Bundler устанавливает гемы в изолированное окружение bundle install # Запуск с изоляцией bundle exec rails server

#Go: модули

# Go модули автоматически изолируют зависимости go mod init myapp go mod tidy # Зависимости кэшируются в $GOPATH/pkg/mod

#Точные версии vs диапазоны

#Точные версии (рекомендуется)

# requirements.txt flask==3.0.0 requests==2.31.0

Преимущества:

  • ✅ Полная воспроизводимость: у всех разработчиков одинаковые версии
  • ✅ Предсказуемое поведение: нет сюрпризов при обновлении
  • ✅ Легче отладка: известно, какая версия работает

Недостатки:

  • ⚠️ Нужно вручную обновлять версии
  • ⚠️ Можно пропустить важные security-патчи

#Диапазоны версий

# requirements.txt flask>=3.0.0,<4.0.0 requests>=2.31.0

Преимущества:

  • ✅ Автоматическое получение минорных обновлений
  • ✅ Security-патчи применяются автоматически

Недостатки:

  • ⚠️ Разные версии у разных разработчиков
  • ⚠️ Возможны неожиданные поломки

#Компромиссный подход

# Точные версий для production # Диапазоны для разработки # requirements.txt flask==3.0.0 requests==2.31.0 # requirements-dev.txt pytest>=7.4.0 black>=23.0.0
# Production: точные версии pip install -r requirements.txt # Разработка: свежие инструменты pip install -r requirements-dev.txt

#Зависимости для разработки vs production

#Разделение зависимостей

# requirements.txt (production) flask==3.0.0 gunicorn==21.2.0 psycopg2==2.9.9 # requirements-dev.txt (разработка) -r requirements.txt # Включает production-зависимости pytest==7.4.0 black==23.12.0 flake8==7.0.0 mypy==1.8.0
# Установка только production-зависимостей pip install -r requirements.txt # Установка всех зависимостей (включая dev) pip install -r requirements-dev.txt

#Node.js: dependencies vs devDependencies

{ "dependencies": { "express": "^4.18.0" }, "devDependencies": { "jest": "^29.7.0", "eslint": "^8.56.0" } }
# Production: только dependencies npm install --production # Разработка: все зависимости npm install

#Антипаттерны

#❌ Неявные зависимости

# app.py import requests # ← Предполагается, что установлен глобально import flask # ← «На сервере же есть»
# ❌ Нет файла зависимостей # Разработчики устанавливают пакеты вручную pip install requests pip install flask

Проблема: на новом сервере приложение не запустится.

#❌ Зависимости в коде

# ❌ Неправильно: попытка установить зависимости из кода import subprocess subprocess.run(['pip', 'install', 'requests']) import requests

Проблема: установка зависимостей — задача системы развёртывания, а не кода.

#❌ Плавающие версии без ограничений

# ❌ Неправильно: любая версия flask requests

Проблема: сегодня работает flask==3.0.0, завтра обновится до flask==4.0.0 с breaking changes.

#❌ Зависимости только в Dockerfile

# ❌ Неправильно: зависимости только в Dockerfile FROM python:3.12 RUN pip install flask requests psycopg2 COPY app.py . CMD ["python", "app.py"]

Проблема: нет явного файла зависимостей, сложно обновлять пакеты, невозможно использовать вне Docker.

Правильно:

FROM python:3.12 COPY requirements.txt . RUN pip install -r requirements.txt COPY app.py . CMD ["python", "app.py"]

#Управление зависимостями в CI/CD

#GitHub Actions пример

# .github/workflows/test.yml name: Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install dependencies run: | python -m venv venv source venv/bin/activate pip install -r requirements-dev.txt - name: Run tests run: | source venv/bin/activate pytest

#Автоматическое обновление зависимостей

Используйте инструменты для автоматического обновления:

  • Dependabot (GitHub) — автоматически создаёт PR при обновлении зависимостей
  • Renovate — аналог Dependabot для GitLab и других платформ
  • pip-review — проверка устаревших пакетов
# Проверка устаревших пакетов pip-review --local # Интерактивное обновление pip-review --interactive

#Security и зависимости

#Уязвимости в зависимостях

# Проверка на уязвимости (Python) pip install safety safety check # Проверка на уязвимости (Node.js) npm audit # Проверка на уязвимости (Ruby) bundle audit

#Обновление security-патчей

# Автоматическое обновление безопасных версий pip install --upgrade requests # Если нет breaking changes # Или через Dependabot: # .github/dependabot.yml version: 2 updates: - package-ecosystem: "pip" directory: "/" schedule: interval: "weekly"

#Зависимости и Docker

#Правильный подход

FROM python:3.12-slim WORKDIR /app # Копируем файл зависимостей COPY requirements.txt . # Устанавливаем зависимости (используем кэш) RUN pip install --no-cache-dir -r requirements.txt # Копируем код COPY . . CMD ["gunicorn", "app:app"]

Преимущества:

  • ✅ Кэш Docker: при изменении кода зависимости не переустанавливаются
  • ✅ Явные зависимости: видно, что требуется приложению
  • ✅ Воспроизводимость: одинаковые версии в Docker и локально

#Multi-stage сборка

# Stage 1: сборка зависимостей FROM python:3.12 as builder WORKDIR /app COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt # Stage 2: финальный образ FROM python:3.12-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH CMD ["gunicorn", "app:app"]

#Проверка соответствия принципу

Задайте себе вопросы:

  • Все ли зависимости явно указаны в файле зависимостей?
  • Можно ли развернуть приложение на чистом сервере одной командой?
  • Используются ли виртуальные окружения для изоляции?
  • Зафиксированы ли точные версии для production?
  • Разделены ли зависимости для разработки и production?
  • Проверяются ли зависимости на уязвимости?

#Связь с другими факторами

  • Build, Release, Run — установка зависимостей происходит на стадии Build
  • Dev/Prod Parity — одинаковые зависимости в development и production
  • Backing Services — клиенты для БД, кэша, очередей тоже зависимости

#Пример из практики

#До: хаос зависимостей

# На машине разработчика pip list | grep flask Flask 2.3.2 # На staging-сервере pip list | grep flask Flask 1.1.2 # ← Старая версия! # На production-сервере pip list | grep flask # ← Flask не установлен, приложение падает

Проблемы:

  • Непонятно, какая версия правильная
  • Обновление ломает что-то в неожиданном месте
  • Новый разработчик тратит день на настройку окружения

#После: явные зависимости

# requirements.txt flask==3.0.0 requests==2.31.0 gunicorn==21.2.0 psycopg2==2.9.9
# Любой разработчик: git clone repo cd repo python -m venv venv source venv/bin/activate pip install -r requirements.txt python app.py # ✅ Работает # Любой сервер: git pull pip install -r requirements.txt systemctl restart myapp # ✅ Работает

Результат:

  • Одинаковые версии у всех разработчиков
  • Предсказуемое развёртывание
  • Новое окружение за 5 минут

Ключевой вывод: Зависимости должны быть явно объявлены, изолированы и зафиксированы. Это обеспечивает воспроизводимость, предсказуемость и лёгкое развёртывание на любом окружении.

Далее: Config — конфигурация в среде