跳转到正文

📦 包管理与构建 ​

不同语言把“依赖”拆在不同层次。先分清工具职责,再比较命令:

  • 运行时版本管理器切换 JDK、Node.js、Python、Ruby 等工具链版本,例如 SDKMAN、fnm、pyenv、rustup;它不解析项目依赖。
  • 包管理器与依赖解析器读取项目清单、选择版本、下载包并生成锁定或完整性记录,例如 Maven、npm、uv、Cargo。
  • 构建工具把源码变成产物,例如 Ant、Gradle、CMake;部分工具同时集成依赖管理,但 CMake 本身不是包管理器。
  • 包仓库保存和分发制品,例如 Maven Central、npm、PyPI、crates.io;仓库也不是本地安装工具。

横向索引 ​

语言主流方案ManifestLockfile / 完整性默认仓库新项目默认建议
JavaMaven / Gradlepom.xml / build.gradle.ktsGradle dependency lock;Maven 固定版本与 BOMMaven CentralMaven 求稳;复杂构建用 Gradle Wrapper
KotlinGradle Kotlin DSL / Mavenbuild.gradle.kts / pom.xmlGradle lock / Maven 固定解析Maven CentralJVM/KMP 优先 Gradle,并统一 Kotlin 插件版本
GroovyGradle / Maven / Grapebuild.gradle / pom.xml / @GrabGradle lock / Maven 固定版本Maven Central应用优先 Gradle Wrapper;一次性脚本才用 Grape
Scalasbt / Scala CLI / Millbuild.sbt / 源码指令 / build.millCoursier 解析与受控锁定Maven Central成熟项目用 sbt;单文件和小项目用 Scala CLI
ClojureClojure CLI / Leiningendeps.edn / project.clj固定 Maven 版本与 Git SHAMaven Central / Clojars新项目优先 tools.deps + tools.build;遗留项目保留 Leiningen
JavaScriptnpm / pnpm / Yarn / Bunpackage.json各工具自己的 lockfilenpm registrypnpm 或 npm;固定包管理器版本且只留一个锁文件
TypeScriptJavaScript 包管理器 + tscpackage.json、tsconfig.json同所选包管理器npm registry编译器放开发依赖,明确 types 与生成物边界
Pythonuv / pip-tools / Poetry / pippyproject.toml、requirements.inuv.lock / poetry.lock / 固定 requirementsPyPI新应用优先 uv;保守项目用 venv + pip-tools
GoGo Modulesgo.modgo.sum 是完整性记录Go module proxy使用 Modules;离线或审计场景再 vendor
RustCargoCargo.tomlCargo.lockcrates.ioCargo;应用和 workspace 提交锁文件
C & C++Conan / vcpkg / 系统包conanfile.* / vcpkg.jsonConan lock / vcpkg baselineConan Center / vcpkg registry / OS按 ABI 与交付环境选 Conan 或 vcpkg
C#NuGet / dotnet CLI.csproj / Directory.Packages.propspackages.lock.jsonnuget.orgPackageReference;多项目使用 CPM
PHPComposercomposer.jsoncomposer.lockPackagistComposer,部署只运行 install
RubyRubyGems + Bundler.gemspec / GemfileGemfile.lockRubyGems.orgBundler;应用提交锁文件
HTMLvendoring / npm / pnpm / import mapspackage.json 或 HTML 映射所选包管理器 lockfile / SRInpm registry / CDN简单页 vendor;工程项目使用 npm/pnpm
CSSvendoring / npm / pnpmpackage.json、工具配置所选包管理器 lockfile / SRInpm registry / CDN分开管理浏览器 CSS 与 Sass/PostCSS/Stylelint 工具

共同原则 ​

  1. 运行时、包管理器和构建工具分别固定版本;Java 使用 Wrapper,Node.js 工具通过 Corepack 或 packageManager 字段固定。
  2. 一个项目只维护一套依赖真相和一个对应锁文件,不同时提交 npm、Yarn 与 pnpm 的锁文件。
  3. CI 与部署采用 frozen、locked 或等价安装模式;升级应作为独立、可审查的变更。
  4. 依赖树、完整性校验与漏洞检查解决不同问题,需要分别执行。
  5. 缓存和镜像只是下载来源,不是锁文件;更换来源后仍要保留 TLS、哈希和来源审计。

Released under the MIT License.