Ах, завораживающая песня собственной системы сборки! Она шепчет: «Ты особенный, твой проект уникален, и только ты можешь создать идеальный инструмент для сборки». Это всё равно что отправиться в поход на Эверест, потому что лестница дома кажется недостаточной. Прежде чем отправиться в это благородное путешествие, позвольте мне рассказать, почему вам стоит reconsiderar это предприятие 🧭.
Ловушка системы сборки: почему DIY не всегда лучше
Представьте себе: вы печёте печенье 🍪. Вы выбираете:
- А) Использовать надёжную духовку с контролем температуры
- Б) Вылепить свою печь из глины во дворе
Это дилемма системы сборки! Хотя создание собственной системы кажется вдохновляющим («Я сделал это!»), часто она превращается в поглощающего ресурсы дракона. Вот почему:
- Бесконечный гном-ремонтник
Ваша собственная система требует постоянного ухода:
# Ваш «простой» скрипт сборки со временем
v1: ./build.sh
v2: ./build.sh --env=prod
v3: ./build.sh --env=prod --target=arm64 --coverage
v4: [500 строк bash спустя] 💀
Каждое новое требование порождает новое бремя поддержки. Готовые системы? Они справляются с пограничными случаями, пока вы пьёте кофе.
2. «Работает на моём компьютере» — лавина
Собственные инструменты сборки становятся снежинками ❄️ — уникальными и хрупкими. Когда:
- CI таинственно сбоит
- У нового сотрудника всё ломается при настройке
- Обновление macOS всё ломает
…вы пожалеете, что не использовали проверенные инструменты.
- Тихий убийца инноваций
Время, потраченное на борьбу со сборками, — это время, не потраченное на:
Ваши конкуренты, использующие стандартные инструменты? Они выпускают функции, пока вы отлаживаете инкрементальную компиляцию.
Когда вам всё же стоит создавать: исключение 1%
Есть обоснованные случаи — если вы:
- Google, масштабирующийся до миллиардов сборок в день
- Создаёте встроенную ОС для марсоходов
- Работаете с экзотическим оборудованием, требующим обнаружения сбоев из-за космических лучей
Для остальных 99%? Давайте рассмотрим лучшие варианты.
Путь спасения: современные решения для сборки
Шаг 1: примите проверенную систему сборки
Вот пример использования Bazel для проекта на Python:
# WORKSPACE
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_python",
sha256 = "a30abdf...",
url = "https://github.com/bazelbuild/rules_python/releases/download/0.8.1/rules_python-0.8.1.tar.gz",
)
# BUILD
load("@rules_python//python:defs.bzl", "py_binary")
py_binary(
name = "my_app",
srcs = ["main.py"],
deps = ["//lib:my_lib"],
)
Ключевые преимущества:
- Герметичные сборки (больше никаких «работает на моём компьютере»)
- Инкрементальные сборки, которые действительно работают
- Общий кеш между командами
Шаг 2: контейнеризация среды сборки
Этап сборки в Dockerfile:
FROM python:3.11-slim as builder
RUN pip install --user poetry
COPY pyproject.toml .
RUN poetry export -f requirements.txt --output requirements.txt
FROM python:3.11-slim
COPY --from=builder requirements.txt .
RUN pip install -r requirements.txt
COPY . .
→ Навсегда устраняет смещение сред
Шаг 3: используйте магию CI
Настройка GitHub Actions:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: pip install -r requirements.txt
- run: pytest
- uses: actions/upload-artifact@v3
with:
path: dist/*.whl
→ Бесплатное параллельное выполнение, кеширование и масштабирование в облаке
Расчёт технического обслуживания
Перевод: этот «простой» скрипт обойдётся вам в 20 раз дороже в долгосрочной перспективе.
Неутешительная правда
Создание собственных систем сборки — это как вырезать себе зубную щётку вручную — технически впечатляюще, но редко стоит усилий. Гиганты (Bazel, Buck, CMake, Make, Gradle) уже:
- Правильно решили проблему недействительности кеша
- Обработали распределённые сборки
- Оптимизировали параллельность
- Создали экосистемы плагинов Ваша энергия лучше потрачена на проблемы, которые ещё не решены проверенными инструментами. А теперь, извините, мне нужно пойти НЕ переписывать свою IDE с нуля… снова. 🔧 Какая у вас история ужасов о системе сборки? Поделитесь ниже! ⬇️