Helm — Dependencies#
Module info#
- Module:
helm.sh/helm/v4 - Go version: 1.25.0
- Direct dependencies: 47 (first
requireblock in go.mod) - Indirect dependencies: ~126 (second
requireblock); go.sum has 523 lines ≈ 261 total modules
Dependency categories#
Core infrastructure / CLI#
github.com/spf13/cobrav1.10.2 — CLI framework powering the entirehelmcommand tree (~57 files import it). The canonical Go CLI framework; used by virtually every tool in the Kubernetes ecosystem.github.com/spf13/pflagv1.0.10 — POSIX-style flags, cobra’s companion. Handles--flag/-fparsing and env var binding.github.com/fatih/colorv1.19.0 — Colorized terminal output for warnings, errors, and diff highlighting.github.com/gosuri/uitablev0.0.4 — Tabular output (used forhelm list,helm repo list, etc.).github.com/moby/termv0.5.2 — Terminal size detection for adaptive output width.k8s.io/klog/v2v2.130.1 — Kubernetes-style structured logging; used for the Kubernetes client internals. Helm’s own code uses Go’slog/slog(stdlib, Go 1.21+).
Template engine / Rendering#
github.com/Masterminds/sprig/v3v3.3.0 — Adds ~100 template functions (string manipulation, math, crypto, date, reflection) on top of Go’stext/template. This is Helm’s core value-add for chart authors.go.yaml.in/yaml/v3v3.0.4 — Newer YAML library (fork ofgopkg.in/yaml.v3under active governance); used in 4 non-test locations, indicating an in-progress migration fromgopkg.in/yaml.v3.github.com/BurntSushi/tomlv1.6.0 — TOML parsing; used for reading Helm’s local configuration file (~/.config/helm/...).github.com/santhosh-tekuri/jsonschema/v6v6.0.2 — JSON Schema validation for chartvalues.schema.jsonfiles, enabling chart authors to validate user-supplied values at install time.github.com/evanphx/json-patch/v5v5.9.11 — JSON merge-patch and strategic merge patch, used inpkg/kube/client.gofor three-way merges during upgrades.github.com/gobwas/globv0.2.3 — Glob pattern matching for.helmignoreand chart dependency filtering.
Kubernetes integration#
This is the largest category by count, reflecting that Helm drives Kubernetes directly rather than shelling out to kubectl:
k8s.io/apiv0.35.1 — Core Kubernetes API types (Pod, Service, Deployment, etc.)k8s.io/apimachineryv0.35.1 — Kubernetes API machinery (Object, GroupVersionKind, unstructured).k8s.io/apiextensions-apiserverv0.35.1 — CRD types; Helm can install CRDs as part of chart deployment.k8s.io/apiserverv0.35.1 — Some server-side machinery needed for server-side apply.k8s.io/cli-runtimev0.35.1 —genericclioptions.ConfigFlagsfor kubeconfig/context handling, used throughoutpkg/action.k8s.io/client-gov0.35.1 — The Kubernetes API client; used for all cluster communication.k8s.io/kubectlv0.35.1 — Some kubectl internals (explain, table printing), embedded rather than shelled out.sigs.k8s.io/controller-runtimev0.23.3 — Used for server-side apply helpers.sigs.k8s.io/kustomize/kyamlv0.21.1 — KYAML pipeline (kio.Pipeline) used inpkg/action/action.gofor resource filtering/transformation.sigs.k8s.io/yamlv1.6.0 — JSON/YAML marshaling bridge; heavily used (31 non-test imports) because Kubernetes types serialize to JSON but are presented as YAML.github.com/fluxcd/cli-utilsv0.37.2-flux.1 — Thekstatuspolling subsystem for watching resource readiness. Helm uses this inpkg/kube/statuswait.goto implement--waitsemantics, borrowing production-tested Kubernetes status machinery from the FluxCD project.
OCI / Registry#
Helm v3/v4 supports storing charts in OCI registries:
oras.land/oras-go/v2v2.6.0 — OCI artifact push/pull operations (helm push,helm pull). ORAS is the standard Go library for OCI distribution beyond container images.github.com/opencontainers/image-specv1.1.1 — OCI image manifest/descriptor types.github.com/opencontainers/go-digestv1.0.0 — Content-addressable digest (SHA256) for OCI layers.github.com/distribution/distribution/v3v3.0.0 — OCI registry server; appears only in test helpers (repotest/server.go) to spin up an in-process registry for integration tests.
WASM Plugin system (new in v4)#
A significant architectural addition for the v4 series:
github.com/extism/go-sdkv1.7.1 — Extism is a universal plugin system built on WebAssembly. Helm v4 uses it to load plugins compiled to WASM, enabling sandboxed execution.github.com/tetratelabs/wazerov1.11.0 — Pure-Go WebAssembly runtime (zero CGo dependencies). The Extism SDK uses it as its WASM execution engine. This replaces the v3 subprocess plugin model with in-process WASM calls.
SQL Storage backend (new in v4)#
Helm v4 adds SQL (PostgreSQL) as a release storage backend alongside Kubernetes Secrets/ConfigMaps:
github.com/jmoiron/sqlxv1.4.0 — Ergonomic SQL toolkit; used inpkg/storage/driver/sql.go.github.com/lib/pqv1.12.1 — PostgreSQL driver fordatabase/sql.github.com/Masterminds/squirrelv1.5.4 — SQL query builder (fluent API); constructs SELECT/INSERT/UPDATE in the storage driver.github.com/rubenv/sql-migratev1.8.1 — Schema migrations for the SQL storage backend.github.com/DATA-DOG/go-sqlmockv1.5.2 (direct, for testing) — SQL mock driver for unit-testing storage driver code without a live database.
Security / Provenance#
github.com/ProtonMail/go-cryptov1.4.1 — OpenPGP implementation (active fork ofgolang.org/x/crypto/openpgpwhich was deprecated). Used inpkg/provenance/sign.gofor chart signing and verification (.provfiles).golang.org/x/cryptov0.49.0 — TLS utilities, bcrypt, and other crypto primitives.github.com/cyphar/filepath-securejoinv0.6.1 — Secure path construction preventing directory traversal; used when extracting charts.github.com/asaskevich/govalidatorv0.0.0-20230301143203-a9d515a09cc2 — Validates URLs, hostnames, and other inputs in repo management.
Versioning / VCS#
github.com/Masterminds/semver/v3v3.4.0 — Semantic versioning parsing and constraint matching; used throughout for chart version checks, dependency resolution, and Kubernetes version constraints (~19 non-test imports).github.com/Masterminds/vcsv1.13.3 — VCS detection (git, hg, svn, bzr) used by the plugin installer to fetch plugins from source control URLs.
Utilities / Output#
github.com/mattn/go-shellwordsv1.0.12 — Shell word splitting; parsesHELM_COMMAND_FLAGSand plugin arg strings.github.com/gofrs/flockv0.13.0 — Cross-platform file locking for the repository cache.golang.org/x/termv0.41.0 — Terminal detection (isatty) for choosing output mode.golang.org/x/textv0.35.0 — Unicode text transformation used indirectly via Sprig.
Testing#
github.com/stretchr/testifyv1.11.1 —assert/require/mock; universal in the codebase.github.com/foxcpp/go-mockdnsv1.2.0 — In-process DNS server mock; used inpkg/enginetests to control DNS lookup behavior for Sprig’slookupfunction.github.com/AdaLogics/go-fuzz-headersv0.0.0-20230811130428-ced1acdcaa24 — Fuzzing utilities; Helm has fuzz targets for chart loading and rendering.
Stdlib reliance#
Helm makes heavy, idiomatic use of the standard library. The pkg/action package alone imports 13 stdlib packages (bytes, errors, fmt, io, log/slog, maps, os, path, path/filepath, slices, strings, sync, text/template, time) against only 4 third-party imports. Notable stdlib choices:
log/slog(Go 1.21+): Helm’s own code uses structured logging via the new stdlib slog rather than logrus or zap.k8s.io/klog/v2appears only for Kubernetes client internals.text/template: The entire chart rendering engine is built on stdlib templates; Sprig adds functions without replacing the template engine itself.mapsandslices(Go 1.21+): Used directly in action.go, signaling the team’s willingness to use the latest stdlib generics-backed packages instead ofgolang.org/x/exp.crypto/*: TLS and x509 used directly inpkg/registryfor mTLS; ProtonMail only supplements where stdlib’s OpenPGP was deprecated.database/sql: The SQL storage driver wraps stdlibdatabase/sqlviajmoiron/sqlx; Helm does not use an ORM.
Shared dependencies#
Dependencies shared with many other projects in the 50-project set (connection points for the book):
| Dependency | Shared with |
|---|---|
github.com/spf13/cobra | k3s, vault, consul, nomad, terraform, dapr, kubectl, and most CLI tools |
github.com/stretchr/testify | Nearly universal across all 50 projects |
k8s.io/client-go + k8s.io/apimachinery | k3s, dapr, controller-runtime-based tools |
sigs.k8s.io/yaml | k3s, kustomize, controller-runtime, any k8s-adjacent tool |
github.com/Masterminds/semver/v3 | k3s, and any tool managing versioned artifacts |
golang.org/x/crypto | vault, consul, nomad, most network-facing tools |
google.golang.org/grpc (indirect) | consul, vault, dapr, nomad |
github.com/sirupsen/logrus (indirect, via distribution) | consul, vault, docker-related tools |
oras.land/oras-go/v2 | Potentially shared with any OCI-aware tool |
github.com/opencontainers/image-spec | Any container-ecosystem tool |
Vendoring#
No vendor directory. Helm relies on the Go module proxy and go.sum for dependency integrity. This is typical for a tool (rather than a library) where reproducible builds are ensured by pinned versions in go.sum and CI infrastructure, not vendoring.
Notable dependency decisions#
WASM over subprocess for plugins (v4): The choice of
wazero+extism/go-sdkover the v3 subprocess model is architecturally significant. Wazero is pure Go (no CGo), runs sandboxed WASM, and avoids the security and portability issues of subprocess plugins. This is one of the boldest dependency choices in the set of 50 projects.SQL storage via four Masterminds-ecosystem packages: The addition of
sqlx+squirrel+sql-migrate+lib/pqas direct deps (all production-grade but bringing ~4 new transitive closure branches) suggests the SQL backend is a first-class v4 feature, not an afterthought. The choice ofsquirrel(query builder) over raw SQL strings is a readability call that avoids an ORM.go.yaml.in/yaml/v3alongsidegopkg.in/yaml.v3: Both YAML libraries are present as direct/indirect deps.go.yaml.inis the newer, actively maintained fork that the Go YAML community has coalesced around; Helm is in the middle of a migration. The coexistence of both is a transitional artifact.fluxcd/cli-utilsfor wait semantics: Rather than reimplementing Kubernetes resource readiness polling, Helm borrows the production-battle-testedkstatuspackage from FluxCD’s cli-utils. This is a dependency on a specific version fork (v0.37.2-flux.1) rather than the upstream, showing pragmatic adoption of a patched version.ProtonMail/go-cryptoovergolang.org/x/crypto/openpgp: Helm explicitly migrated to the ProtonMail fork when the Go team deprecatedx/crypto/openpgp. This is a lesson in depending on deprecated stdlib extensions — when the Go team drops them, the community forks (and Helm followed).Minimal logging framework: No
uber-go/zaporrs/zerolog. Helm useslog/slogfor its own code, which is a deliberate, forward-looking choice that avoids a performance-logging framework dependency in a tool whose hot path is not logging.