Перейти к основному содержимому

Пакетные менеджеры — npm, pip, cargo, go mod и другие

Разработчику Архитектору

Роль пакетного менеджера

Пакетный менеджер (package manager) — программа, которая:

  • скачивает библиотеки (зависимости, dependencies) из реестра (registry);
  • записывает версии в манифест (manifest) проекта;
  • фиксирует точное дерево версий в lock-файле (lock file);
  • запускает скрипты сборки, тестов и публикации.

Менеджер версий языка ставит Node.js 22 или Python 3.12 — сам runtime. Пакетный менеджер ставит lodash или requests — код, который ваш проект импортирует.

Без lock-файла npm install сегодня и через месяц может подтянуть разные минорные версии — CI и production расходятся ("works on my machine").

ШагТемаЗачем
1ГлоссарийМанифест, lock, semver
2npm / yarn / pnpmJavaScript экосистема
3pip / poetry / uvPython
4cargoRust
5go modGo
6PHP, .NET, Javacomposer, NuGet, Maven, Gradle
7CI, audit, monorepoProduction практики
8Troubleshooting и FAQТипичные сбои
МатериалЗачем
Менеджеры версийNode/Python перед npm/pip
npm — углублённоlock, audit, scripts
Структура Node-проектаnode_modules, env
Первая программа Nodenpm init, npm run
WebAssemblycargo + wasm-pack
GitКоммит lock-файлов
Версия runtime и версия пакета

Node 22 + Express 4 — независимые числа. Runtime фиксируют в .nvmrc (620), пакеты — в package-lock.json этой статьи.


Глоссарий

ТерминРасшифровка
Пакет (package)Архив с кодом библиотеки и метаданными
МанифестФайл с перечнем зависимостей и диапазонами версий
Lock-файлТочные версии всего дерева зависимостей
SemVerSemantic Versioning — MAJOR.MINOR.PATCH (1.4.2)
DependencyЗависимость для runtime (нужна в production)
DevDependencyЗависимость только для разработки (тесты, линтеры)
Transitive dependencyЗависимость вашей зависимости (дерево)
RegistryСервер каталога пакетов (npmjs.org, PyPI)
Peer dependencyПакет ожидает, что вы сами установите другую lib (React для UI-kit)
HoistingПодъём общих deps на верх node_modules

Сравнительная таблица

ЭкосистемаМенеджерМанифестLock-файлРеестр
JavaScriptnpm / yarn / pnpmpackage.jsonpackage-lock.jsonregistry.npmjs.org
JavaScriptyarnpackage.jsonyarn.lockregistry.npmjs.org
JavaScriptpnpmpackage.jsonpnpm-lock.yamlregistry.npmjs.org
Pythonpiprequirements.txt(нет*)pypi.org
Pythonpoetrypyproject.tomlpoetry.lockpypi.org
Pythonuvpyproject.tomluv.lockpypi.org
RustcargoCargo.tomlCargo.lockcrates.io
Gogo modgo.modgo.sumproxy.golang.org
PHPcomposercomposer.jsoncomposer.lockpackagist.org
.NETNuGet.csprojpackages.lock.jsonnuget.org
JavaMavenpom.xml(нет единого*)Maven Central
Java/KotlinGradlebuild.gradle.ktsgradle.lockfileMaven Central

* pip без poetry/uv — lock вручную или pip freeze; Maven — через BOM или Gradle lock.


npm (Node.js)

npm (Node Package Manager) — стандартный менеджер для JavaScript и Node.js. Поставляется вместе с Node; версию Node — через fnm/nvm.

Шаг 1 — инициализация проекта

mkdir my-api && cd my-api
npm init -y

Флаг -y — значения по умолчанию в package.json.

Шаг 2 — установка зависимостей

npm install express
npm install -D typescript @types/node
npm install -D eslint

Разбор:

  • npm install expressdependency (нужен в runtime);
  • -D (или --save-dev) — devDependency (только разработка);
  • создаётся/обновляется package-lock.json.

Шаг 3 — скрипты

В package.json:

{
"name": "my-api",
"type": "module",
"scripts": {
"dev": "node --watch server.js",
"start": "node server.js",
"lint": "eslint ."
},
"dependencies": {
"express": "^4.21.0"
},
"devDependencies": {
"typescript": "^5.6.0"
}
}
npm run dev
npm start

npm start — сокращение без run.

Шаг 4 — CI установка

npm ci

npm ci (clean install):

  • требует существующий package-lock.json;
  • удаляет node_modules и ставит точно по lock;
  • быстрее и строже, чем npm install в CI.

Шаг 5 — audit и outdated

npm audit
npm audit fix
npm outdated
КомандаДействие
npm install pkgДобавить dependency
npm install -D pkgДобавить devDependency
npm uninstall pkgУдалить пакет
npm ciУстановка строго по lock (CI)
npm updateОбновить в рамках semver диапазона
npm lsДерево установленных пакетов

Подробнее — npm — команды и lock-файлы.

yarn и pnpm (кратко)

yarn:

corepack enable
yarn init -y
yarn add express
yarn install --frozen-lockfile

pnpm — экономит диск за счёт content-addressable store:

corepack enable
pnpm init
pnpm add express
pnpm install --frozen-lockfile

В monorepo часто pnpm workspaces или yarn workspaces.

Один lock на репозиторий

Не смешивайте npm и yarn в одном проекте — будет два lock-файла и хаос в CI. Команда выбирает один менеджер и фиксирует в README и CI.


Python — pip, poetry, uv

pip + venv (минимализм)

pip — установщик пакетов из PyPI (Python Package Index).

python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
python -m pip install --upgrade pip
pip install requests
pip freeze > requirements.txt
pip install -r requirements.txt

Разбор:

  • venv — изолированное окружение; не пишет в system Python;
  • pip freeze — snapshot версий (грубый lock);
  • requirements.txt — манифест без семантики dev/prod.
Никогда pip в system Python

sudo pip install ломает системный Python на Linux. Всегда python -m venv или pyenv + venv. Версию Python — pyenv.

poetry

poetry — манифест, lock, publish в одном CLI.

pip install poetry
poetry new myapp
cd myapp
poetry add fastapi
poetry add --group dev pytest
poetry install
poetry run python main.py
poetry shell

pyproject.toml — единый конфиг; poetry.lockкоммитят для приложений.

poetry lock --no-update
poetry export -f requirements.txt --output requirements.txt

uv (Astral)

uv — быстрый менеджер (Rust), совместим с pyproject.toml.

curl -LsSf https://astral.sh/uv/install.sh | sh
uv init myapp
cd myapp
uv add flask
uv add --dev ruff
uv sync
uv run python app.py
pip + venvpoetryuv
Простотасредняя
Lockвручную
Скоростьнорманормаочень быстро
Monorepoслабо

Новичку: venv + pip или сразу uv; для библиотек с publish — poetry.

Старт — Первая программа на Python.


Rust — cargo

cargo — менеджер пакетов и сборщик Rust. Реестр — crates.io. Toolchain — rustup.

Шаг 1 — новый проект

cargo new hello --bin
cd hello
cargo run

Шаг 2 — зависимости

cargo add serde --features derive
cargo add tokio --features full
cargo add --dev criterion

Или вручную в Cargo.toml:

[package]
name = "hello"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }

[dev-dependencies]
criterion = "0.5"

Шаг 3 — сборка и тесты

cargo build
cargo build --release
cargo test
cargo clippy
cargo fmt

Шаг 4 — lock и публикация

cargo fetch
cargo publish # после аккаунта на crates.io
Тип проектаКоммитить Cargo.lock?
Приложение (binary)Да
Библиотека (library)Обычно нет

Для WebAssembly:

cargo install wasm-pack
wasm-pack build --target web

Go — go mod

go mod — встроенный менед модулей Go.

mkdir myapp && cd myapp
go mod init example.com/myapp
go get github.com/gin-gonic/gin@v1.10.0
go build
go test ./...
go mod tidy
go mod verify

Разбор:

  • go mod init — создаёт go.mod с module path;
  • go get — добавляет/обновляет dependency;
  • go mod tidy — удаляет неиспользуемые, добавляет недостающие;
  • go.sum — checksums (lock); коммитят.

Переменная GOPROXY:

go env -w GOPROXY=https://proxy.golang.org,direct

Корпоративный proxy — Artifactory, Nexus.


PHP — composer

composer — менеджер для PHP.

composer init
composer require monolog/monolog
composer install
composer update
composer dump-autoload

composer.json + PSR-4 autoload:

{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}

Подключение в коде:

require __DIR__ . '/vendor/autoload.php';

composer.lock — коммитят для deploy parity.


.NET — NuGet

NuGet — менеджер пакетов .NET.

dotnet new console -n MyApp
cd MyApp
dotnet add package Newtonsoft.Json
dotnet restore
dotnet build
dotnet run

Central Package Management (CPM) — один Directory.Packages.props для monorepo:

<Project>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

Lock:

dotnet restore --use-lock-file

См. C# — о разделе.


Java — Maven и Gradle

Maven

Maven — XML-манифест pom.xml, репозиторий Maven Central.

mvn archetype:generate -DgroupId=com.example -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
cd demo
mvn compile
mvn test
mvn package

Dependency в pom.xml:

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.0.0-jre</version>
</dependency>

Gradle (Kotlin DSL)

gradle init --type kotlin-application
./gradlew build
./gradlew test

build.gradle.kts:

dependencies {
implementation("org.springframework.boot:spring-boot-starter-web:3.3.0")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
}

Включение lock:

dependencyLocking {
lockAllConfigurations()
}

Gradle чаще в Android/Kotlin; Maven — enterprise legacy. Java — о разделе.


SemVer на практике

Версия ^1.4.2 в npm означает >=1.4.2 <2.0.0.

Символnpmcargogo
Exact1.4.2=1.4.2@v1.4.2
Compatible^1.4.21.4
Minimum>=1.4.21.4.2

MAJOR — breaking changes; MINOR — новые фичи совместимо; PATCH — багфиксы.


Общие практики production

ПрактикаЦель
Коммитить lock-файлВоспроизводимые сборки
npm ci / poetry install / cargo fetch в CIБез интерактива
Разделение dev/prod depsМеньший Docker-образ
npm audit / cargo audit / DependabotБезопасность
Приватный registryКорпоративные пакеты
Pin runtime в DockerFROM node:22.11-alpine + lock

Docker слои

FROM node:22-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY . .
RUN npm run build
CMD ["node", "dist/server.js"]

Сначала копируют только манифест + lock — слой кэшируется при изменении только кода.

Dependabot / Renovate

Автоматические PR на обновление deps. Правила:

  • patch/minor — auto-merge после CI;
  • major — ручной review;
  • игнорировать major для критичных lib до миграции.

Monorepo

СтекИнструмент
JavaScriptnpm/yarn/pnpm workspaces
Pythonuv workspace, poetry (ограниченно)
RustCargo workspace
Gomulti-module или monolith
.NETsolution + CPM

Пример pnpm:

# pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'

Корневой package.json:

{
"private": true,
"scripts": {
"build": "pnpm -r run build"
}
}

Приватные реестры

ЭкосистемаРешение
npmVerdaccio, Artifactory, GitHub Packages
PyPIdevpi, Artifactory
cargocargo vendor, private registry
NuGetAzure Artifacts, GitHub Packages

.npmrc:

@myorg:registry=https://npm.mycompany.com/
//npm.mycompany.com/:_authToken=${NPM_TOKEN}

CI шаблоны

Node

- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'
- run: npm ci
- run: npm test

Python (uv)

- uses: astral-sh/setup-uv@v4
- run: uv sync --frozen
- run: uv run pytest

Rust

- uses: dtolnay/rust-toolchain@stable
- run: cargo test --locked

Флаг --locked — fail, если Cargo.lock не синхронизирован с Cargo.toml.


Troubleshooting

СимптомВероятная причинаРешение
"Works on my machine"Нет lock в GitЗакоммитьте lock; CI npm ci
ERESOLVE peer dependency (npm)Конфlict версий React и libВыровнять версии; временно --legacy-peer-deps
pip ставит в systemЗабыли venvpython -m venv .venv
ModuleNotFoundErrorvenv не активированsource .venv/bin/activate
go: module not foundНет tidy / wrong GOPROXYgo mod tidy; проверить proxy
cargo build: lock mismatchToml изменён без updatecargo update или --locked в CI
node_modules hugeДубликаты версийnpm dedupe; рассмотреть pnpm
Permission denied global npm-g без правnvm/fnm; не global; npx
poetry: solver errorНесовместимые pinsОслабить версии; poetry update
Slow CI installНет cacheactions/setup-node cache; uv cache

FAQ

npm install или npm ci?

Разработка — npm install (может обновить lock). CI и Docker — npm ci.

Коммитить ли node_modules?

Нет. Только lock + манифест. Исключение — некоторые legacy; норма — .gitignore на node_modules.

pip freeze и poetry.lock — в чём разница?

pip freeze не различает dev/prod и не resolver-aware. poetry/uv решают конфликты версий.

cargo publish — как?

Аккаунт на crates.io, API token, cargo publish. Имя crate глобально уникально.

Один репозиторий — npm и cargo?

Да (WASM: JS frontend + Rust core). Два lock-файла — норма; CI job на каждый стек.

Связь с 620?

Сначала правильный node/python/rustc, потом npm install/pip/cargo build.


Полный практикум — REST API на npm

Пошаговый мини-проект после установки Node через fnm.

Шаг 1 — каталог и версия

mkdir notes-api && cd notes-api
echo "22" > .nvmrc
fnm use
node -v

Шаг 2 — манифест

npm init -y
npm pkg set type=module
npm install express
npm install -D nodemon eslint

Шаг 3 — scripts

npm pkg set scripts.dev="nodemon server.js"
npm pkg set scripts.start="node server.js"

Шаг 4 — server.js

import express from 'express';

const app = express();
app.use(express.json());

const notes = [];

app.get('/health', (_, res) => res.json({ ok: true }));
app.get('/notes', (_, res) => res.json(notes));
app.post('/notes', (req, res) => {
const note = { id: Date.now(), text: req.body.text ?? '' };
notes.push(note);
res.status(201).json(note);
});

app.listen(3000, () => console.log('http://127.0.0.1:3000'));

Шаг 5 — проверка

npm run dev
curl http://127.0.0.1:3000/health
curl -X POST http://127.0.0.1:3000/notes -H "Content-Type: application/json" -d "{\"text\":\"test\"}"

Шаг 6 — lock в Git

git add package.json package-lock.json .nvmrc server.js
git commit -m "chore: init notes-api with lock"

Подробнее — 262, 265.


Ruby — Bundler

Bundler — менеджер для Ruby gems.

gem install bundler
bundle init
bundle add sinatra
bundle install
bundle exec ruby app.rb

Gemfile + Gemfile.lock — lock коммитят. Версию Ruby — rbenv в 620.


Elixir — Mix

Mix — встроенный tool Elixir:

mix new myapp
cd myapp
mix deps.get
mix compile
mix test
mix hex.publish # после аккаунта

Зависимости в mix.exs; lock — mix.lock.


Swift — Swift Package Manager

swift package init --type executable
swift build
swift run

Package.swift — манифest; Package.resolved — lock.


Дерево зависимостей — как читать

npm ls express
npm ls --all --depth=1
cargo tree
go mod graph | head
poetry show --tree

Transitive dependency — пакет, который потянул ваш пакет. Уязвимость в transitive — патчите через override/resolution или обновление родителя.


npm overrides (форс версии)

В package.json корня monorepo:

{
"overrides": {
"lodash": "4.17.21"
}
}

Форсирует версию во всём дереве — осторожно, может сломать peer deps.


Poetry — полный цикл библиотеки

poetry new mylib
cd mylib
poetry add requests
poetry add --group dev pytest
poetry build
poetry publish

Структура:

mylib/
pyproject.toml
poetry.lock
mylib/
__init__.py
tests/

pyproject.toml секции:

  • [tool.poetry.dependencies] — runtime;
  • [tool.poetry.group.dev.dependencies] — dev;
  • [build-system] — backend сборки.

uv — monorepo workspace

uv init --package app-a
uv init --package app-b

pyproject.toml корня:

[tool.uv.workspace]
members = ["app-a", "app-b"]
uv sync
uv run --package app-a python -m app_a

cargo — features и workspaces

Cargo.toml workspace:

[workspace]
members = ["crates/core", "crates/cli"]

[workspace.dependencies]
serde = "1.0"

В member:

[dependencies]
serde = { workspace = true }
core = { path = "../core" }

Features:

cargo build --features "wasm-api"
cargo test --all-features

Для WASM: wasm-pack build -p core.


Безопасность — audit по экосистемам

ЭкосистемаКоманда
npmnpm audit, npm audit fix
Rustcargo install cargo-audit && cargo audit
Pythonpip-audit, poetry audit (если доступно)
Gogovulncheck ./...
.NETdotnet list package --vulnerable

Dependabot в GitHub — автоматические PR на обновления. Политика:

  • patch — merge после CI;
  • minor — review;
  • major — отдельный спринт.

SBOM (Software Bill of Materials)

Для compliance (ISO, FedRAMP) генерируют SBOM:

npm sbom --sbom-format cyclonedx

или сторонние tools (Syft, Trivy). Lock-файл — минимальный SBOM для разработки.


Кэширование в CI

GitHub Actions — npm

- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'

GitHub Actions — cargo

- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

GitHub Actions — uv

- uses: astral-sh/setup-uv@v4
with:
enable-cache: true

Пошаговый Python-проект на uv

curl -LsSf https://astral.sh/uv/install.sh | sh
uv init fastapi-demo
cd fastapi-demo
uv add fastapi uvicorn
uv add --dev httpx pytest

main.py:

from fastapi import FastAPI

app = FastAPI()

@app.get("/health")
def health():
return {"ok": True}
uv run uvicorn main:app --reload
curl http://127.0.0.1:8000/health
uv lock
git add pyproject.toml uv.lock

Версию Python задайте через pyenv или uv python pin 3.12.


Сравнение yarn, pnpm, npm (детально)

Критерийnpmyarnpnpm
Lock filepackage-lock.jsonyarn.lockpnpm-lock.yaml
Дискдубликатыдубликатыcontent-address store
Strict node_modulesflat hoistingflatsymlinks, строже
Monorepoworkspacesworkspacesworkspaces
CI frozennpm ciyarn install --immutablepnpm i --frozen-lockfile

Выбор — политика команды; смешивать lock-файлы в одном репо нельзя.


Разрешение конфликтов версий

npm ERESOLVE

npm ERR! ERESOLVE could not resolve

Шаги:

  1. npm ls react — кто требует какую версию;
  2. Обновить родительский пакет;
  3. Временно npm install --legacy-peer-deps (не для production lock);
  4. overrides в package.json.

cargo

error: failed to select a version for `serde`
cargo update -p serde
cargo tree -d # duplicates

poetry

poetry update package-name
poetry lock

Дополнительный Troubleshooting

СимптомПричинаРешение
npm ERR! code EACCESGlobal install без правfnm; локальный prefix
cargo build очень долгоCold cacheCI cache; sccache
Duplicate packages npmHoistingnpm dedupe; pnpm
ResolutionImpossible poetryКонфликт pinsОслабить версии
uv sync mismatchLock устарелuv lock
NuGet 401Нет token private feednuget.config credentials
Gradle dependency failedVPN/proxygradle.properties proxy

FAQ — дополнительно

Чем npm update отличается от npm install pkg@latest?

update — в рамках semver диапазона в package.json. @latest — явный bump, может crossing major.

Нужен ли package-lock для библиотеки?

Для публикуемой npm-библиотеки lock обычно не коммитят — потребители резолвят сами. Для приложения — всегда коммитят.

Как offline install?

npm ci --offline # если cache warm
cargo vendor # vendoring для Rust
pip download -r req.txt # wheelhouse

Как связаны 620 и 621 в onboarding?

fnm use && node -v # 620
npm ci # 621

Дополнительные упражнения

  1. Monorepo: pnpm workspaces с двумя пакетами и shared dependency.
  2. cargo audit — исправьте одну advisory через cargo update.
  3. Poetry: publish на TestPyPI.
  4. Gradle: включите dependencyLocking и закоммитьте lockfile.
  5. Сгенерируйте SBOM для Node-проекта.
  6. Настройте Dependabot для package.json.

Kotlin — Gradle и JDK

Kotlin/Android проекты используют Gradle (см. раздел Maven и Gradle выше) и pin JDK через sdkman или JAVA_HOME:

sdk install java 17.0.11-tem
export JAVA_HOME=$HOME/.sdkman/candidates/java/current
./gradlew build

Kotlin — о разделе.


Публикация пакетов — краткий гид

ЭкосистемаКомандаРеестр
npmnpm publishregistry.npmjs.org
PyPIpoetry publish / uv publishpypi.org
Rustcargo publishcrates.io
Gogit tag v1.0.0proxy.golang.org
NuGetdotnet nuget pushnuget.org

Перед publish:

  • semver bump в манифесте;
  • changelog;
  • npm pack / cargo package — dry-run tarball.

Renovate config — пример

renovate.json:

{
"extends": ["config:recommended"],
"packageRules": [
{
"matchManagers": ["npm"],
"rangeStrategy": "pin"
}
]
}

Pin strategy — PR с exact version в lock-friendly workflow.


Упражнения для практики

  1. Создайте Node-проект, добавьте express, закоммитьте package-lock.json, сломайте CI удалив lock — почините.
  2. Python: venv + requirements.txt и uv + uv.lock — сравните время install.
  3. Rust: cargo new, cargo add, cargo test --locked в CI.
  4. Go: go mod init, go get pinned version, go mod tidy после удаления import.
  5. Запустите npm audit и исправьте одну уязвимость через npm audit fix.
  6. Соберите Docker-образ с npm ci --omit=dev и замерьте размер.

Makefile — единая точка входа

.PHONY: install test

install:
fnm use
npm ci
python -m venv .venv
. .venv/bin/activate && pip install -r requirements.txt

test:
npm test
. .venv/bin/activate && pytest

Команда make install скрывает детали 620 и 621 от новичка.


Чек-лист production dependencies

  • Lock-файл в Git
  • CI использует frozen install (npm ci, uv sync --frozen, cargo test --locked)
  • npm audit / cargo audit в pipeline
  • Dependabot/Renovate включён
  • Dev deps не попадают в production Docker (--omit=dev)
  • Private registry credentials в CI secrets, не в repo
  • SBOM генерируется для release
  • Pin runtime в Docker совпадает с .nvmrc

Связанные материалы

ТемаМатериал
Версии Node/PythonМенеджеры версий
WASM + cargoWebAssembly (WASM)
npm углублённоnpm — lock и audit
Структура проектаСтруктура Node-проекта
GitОсновы работы с Git
ЯзыкиЯзык программирования
PHPPHP — о разделе
GoGo — о разделе

Внешние ресурсы

Ruby — Bundler deep dive

Bundler — lock для Ruby gems.

gem install bundler
bundle init
bundle add sinatra
bundle install
bundle exec ruby app.rb

Gemfile:

source 'https://rubygems.org'
ruby '3.3.4'
gem 'sinatra', '~> 4.0'

Gemfile.lockкоммитят. CI:

bundle install --deployment
КомандаДействие
bundle updateОбновить gems в рамках Gemfile
bundle outdatedСписок устаревших
bundle auditCVE check

Pin Ruby через rbenv. Ruby intro.


Elixir — Mix и Hex

Mix — build tool; Hex — реестр.

mix new my_app
cd my_app
mix deps.get
mix test
mix phx.new my_web --no-html --no-assets

mix.exs:

defp deps do
[
{:phoenix, "~> 1.7"},
{:jason, "~> 1.4"}
]
end

mix.lock — коммитят. Override:

{:plug, "~> 1.15", override: true}

OTP version pin — 620 asdf elixir. Elixir intro.


Scala — sbt и Coursier

sbt — стандарт сборки.

// build.sbt
scalaVersion := "3.4.1"
libraryDependencies += "org.typelevel" %% "cats-core" % "2.10.0"
sbt compile
sbt test
sbt assembly

Coursier для CLI:

cs install ammonite
amm

Lock в sbt — libraryDependencies pin + optional dependencyLockIncludeTransitiveDependencies. Spark projects — 5.18 Scala.


Kotlin — Gradle version catalogs

gradle/libs.versions.toml:

[versions]
kotlin = "2.0.0"
coroutines = "1.8.1"

[libraries]
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
// build.gradle.kts
plugins {
kotlin("jvm") version "2.0.0"
}
dependencies {
implementation(libs.coroutines.core)
}

gradle.lockfile./gradlew dependencies --write-locks. Android — тот же Gradle; Kotlin intro.


Swift — Swift Package Manager

SPM встроен в Xcode и CLI.

swift package init --type executable
swift build
swift test
swift run

Package.swift:

// swift-tools-version: 5.10
import PackageDescription

let package = Package(
name: "MyLib",
dependencies: [
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.3.0")
],
targets: [
.executableTarget(name: "MyLib", dependencies: [
.product(name: "ArgumentParser", package: "swift-argument-parser")
])
]
)

Package.resolved — lock; коммитят для apps. Swift intro.


Dart — pub

dart create my_app
cd my_app
dart pub add http
dart pub get
dart run

pubspec.yaml:

dependencies:
flutter:
sdk: flutter
http: ^1.2.0

pubspec.lock — коммитят для приложений. Flutter — 5.22 Dart.


Haskell — Stack и Cabal

Stack — pin GHC + snapshots.

# stack.yaml
resolver: lts-22.28
packages:
- .
stack build
stack test
stack exec my-exe

Cabal + cabal.project.freeze — альтернатива lock. Haskell intro.


Clojure — deps.edn и Leiningen

tools.deps (современный):

;; deps.edn
{:deps {org.clojure/clojure {:mvn/version "1.12.0"}
ring/ring-core {:mvn/version "1.11.0"}}}
clj -M:dev
clj -X:run

Leiningenproject.clj + lein deps. Lock через tools.deps basis или maven lock. Clojure intro.


Perl — cpanminus

cpanm Dancer2
cpanm --installdeps .

cpanfile для Carton:

requires 'Dancer2', '0.86';

cpanfile.snapshot — lock. Perl intro.


Сводная таблица экосистем — lock-файлы

ЯзыкМенеджерМанифестLock
RubybundlerGemfileGemfile.lock
Elixirmixmix.exsmix.lock
Scalasbtbuild.sbtlockfile (optional)
Kotlin/JVMGradlebuild.gradle.ktsgradle.lockfile
SwiftSPMPackage.swiftPackage.resolved
Dartpubpubspec.yamlpubspec.lock
Haskellstackstack.yamlsnapshot implicit
Clojuretools.depsdeps.ednbasis / maven
Perlcartoncpanfilecpanfile.snapshot

Private registry — общий паттерн

# npm
npm config set @myorg:registry https://npm.mycompany.com

# pip
pip config set global.index-url https://pypi.mycompany.com/simple

# cargo
# .cargo/config.toml [registries]

# NuGet
dotnet nuget add source https://nuget.mycompany.com/v3/index.json -n internal

CI secrets — NPM_TOKEN, POETRY_HTTP_BASIC, CARGO_REGISTRIES_*.


SBOM и compliance

SBOM (Software Bill of Materials) — список всех deps для audit.

ToolStack
syftUniversal
cyclonedx-npmNode
cargo-cyclonedxRust
pip-auditPython

Храните SBOM как артеfact CI для enterprise-клиентов.


Дополнительные FAQ по экосистемам

Зачем bundle exec?

Запуск с gems exactly из Gemfile.lock, не global.

mix deps.clean --unlock?

Сброс lock — только осознанно, затем mix deps.get.

sbt vs Maven для Scala?

sbt — idiomatic Scala; Maven — реже для greenfield Scala.

Flutter pub get vs pub upgrade?

get — по lock; upgrade — bump constraints.

Stack vs Cabal для Haskell новичку?

Stack проще pin GHC; Cabal — гибче для library authors.


Упражнения по экосистемам

  1. Ruby: Sinatra API + Gemfile.lock + bundle audit.
  2. Elixir: mix phx.new + mix test в CI.
  3. Scala: sbt project + scalafmt check.
  4. Kotlin: Gradle catalog + lockfile commit.
  5. Swift: SPM dependency + Package.resolved.
  6. Clojure: deps.edn project + clj -M:test.


Содержание