Pub 简介 #

什么是 Pub? #

Pub 是 Dart 编程语言的官方包管理系统。它由 Dart 核心团队开发和维护,是 Dart SDK 的标准组成部分。Pub 提供了包的打包、发布、安装、更新等完整功能,是 Dart 和 Flutter 开发者必不可少的工具。

核心定位 #

text
┌─────────────────────────────────────────────────────────────┐
│                           Pub                                │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  包管理      │  │  依赖解析    │  │  版本控制    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  包发布      │  │  本地缓存    │  │  脚本运行    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘

Pub 的历史 #

发展历程 #

text
2011年 ─── Dart 语言发布
    │
    │      Google 发布 Dart 语言
    │      Pub 作为配套工具开始开发
    │
2012年 ─── Pub 首次发布
    │
    │      基本的包管理功能
    │      pub.dartlang.org 上线
    │
2013年 ─── Flutter 项目启动
    │
    │      Pub 成为 Flutter 的包管理器
    │      支持 Flutter 特定依赖
    │
2018年 ─── Dart 2.0 发布
    │
    │      Pub 2.0 重大更新
    │      改进的依赖解析算法
    │
2020年 ─── pub.dev 上线
    │
    │      新的包仓库域名
    │      改进的搜索和评分系统
    │
2021年 ─── Dart 2.14+
    │
    │      dart pub 命令集成到 Dart SDK
    │      更好的工具链整合
    │
至今   ─── 生态系统核心
    │
    │      超过 4 万个包
    │      累计下载超过 100 亿次

里程碑版本 #

版本 时间 重要特性
1.0 2012 基本的包管理功能
1.8 2015 Flutter 支持
2.0 2018 新的依赖解析器
2.1 2019 Git 依赖改进
2.4 2020 私有仓库支持增强
2.10 2021 dart pub 命令整合
2.14 2021 更好的错误提示

为什么需要 Pub? #

传统开发的痛点 #

在没有 Pub 之前,开发者面临以下问题:

bash
# 手动下载和管理库
git clone https://github.com/some/library.git
cp -r library/lib ~/my_project/lib/

# 版本冲突
# 项目A需要 library 1.0
# 项目B需要 library 2.0
# 无法同时管理

# 依赖地狱
# library A 依赖 B、C
# B 依赖 D、E
# 手动管理极其困难

Pub 的解决方案 #

bash
# 一条命令安装依赖
dart pub get

# 自动处理依赖
dart pub add http
# 自动安装 http 及其所有依赖

# 项目级依赖隔离
# 每个项目独立的 pubspec.lock

# 版本管理
dependencies:
  http: ^1.0.0
# 灵活的版本约束

Pub 的核心特点 #

1. 原生集成 #

Pub 是 Dart SDK 的标准组成部分:

bash
# 无需单独安装
dart --version
# Dart SDK version: 3.2.0

dart pub --version
# Pub 3.2.0

2. 简洁的命令 #

bash
dart pub get          # 获取依赖
dart pub add http     # 添加依赖
dart pub remove http  # 移除依赖
dart pub upgrade      # 升级依赖
dart pub outdated     # 检查过时依赖
dart pub publish      # 发布包

3. 强大的版本约束 #

Pub 支持语义化版本约束:

yaml
dependencies:
  http: ^1.0.0        # 兼容更新
  path: ">=1.0.0 <2.0.0"  # 范围约束
  crypto: any         # 任意版本(不推荐)

4. 丰富的生态系统 #

pub.dev 是 Dart 的官方包仓库:

指标 数据
包数量 超过 4 万个
累计下载 超过 100 亿次
活跃开发者 数十万
覆盖领域 Web、移动端、CLI、服务器等

5. 安全可靠 #

bash
# 内置安全检查
dart pub publish --dry-run

# 依赖验证
dart pub deps

# 安全审计
dart pub outdated

核心概念 #

Package(包) #

Package 是 Dart 库或应用程序的打包格式,包含代码、资源、文档等。

text
my_package/
├── pubspec.yaml       # 包配置
├── lib/               # 库代码
│   └── my_package.dart
├── bin/               # 可执行文件
│   └── my_package.dart
├── test/              # 测试
├── example/           # 示例
├── web/               # Web 应用
├── tool/              # 工具脚本
└── README.md          # 说明文档

pubspec.yaml(配置文件) #

pubspec.yaml 定义了包的元数据和依赖:

yaml
name: my_package
version: 1.0.0
description: 了解 Pub 的历史发展、核心特点、基本概念,以及它在 Dart/Flutter 生态中的重要地位。
homepage: https://example.com

environment:
  sdk: '>=3.0.0 <4.0.0'

dependencies:
  http: ^1.0.0
  path: ^1.8.0

dev_dependencies:
  test: ^1.24.0
  lints: ^2.0.0

pubspec.lock(锁定文件) #

pubspec.lock 记录精确的依赖版本:

yaml
packages:
  http:
    dependency: "direct main"
    description:
      name: http
      url: "https://pub.dev"
    version: "1.1.0"
  path:
    dependency: transitive
    description: ...
    version: "1.8.3"

依赖类型 #

类型 描述 用途
dependencies 生产依赖 运行时需要的包
dev_dependencies 开发依赖 开发和测试时需要的包
dependency_overrides 依赖覆盖 强制使用特定版本

包的类型 #

库包(Library Package) #

提供可复用的功能,供其他包使用:

yaml
name: my_library
version: 1.0.0

environment:
  sdk: '>=3.0.0 <4.0.0'
text
my_library/
├── pubspec.yaml
├── lib/
│   ├── my_library.dart
│   └── src/
│       └── implementation.dart
└── README.md

应用包(Application Package) #

可执行的应用程序:

yaml
name: my_app
version: 1.0.0
executables:
  my_app: main

environment:
  sdk: '>=3.0.0 <4.0.0'
text
my_app/
├── pubspec.yaml
├── bin/
│   └── main.dart
└── lib/
    └── my_app.dart

Flutter 包 #

专门为 Flutter 设计的包:

yaml
name: my_flutter_package
version: 1.0.0

environment:
  sdk: '>=3.0.0 <4.0.0'
  flutter: '>=3.0.0'

dependencies:
  flutter:
    sdk: flutter

Flutter 插件 #

包含平台特定代码的 Flutter 包:

yaml
name: my_plugin
version: 1.0.0

environment:
  sdk: '>=3.0.0 <4.0.0'
  flutter: '>=3.0.0'

dependencies:
  flutter:
    sdk: flutter

flutter:
  plugin:
    platforms:
      android:
        package: com.example.my_plugin
        pluginClass: MyPlugin
      ios:
        pluginClass: MyPlugin

Pub 与其他工具对比 #

与 npm (Node.js) 对比 #

特性 Pub npm
内置支持 ✅ Dart SDK 自带 ✅ Node.js 自带
锁定文件 ✅ pubspec.lock ✅ package-lock.json
开发依赖 ✅ dev_dependencies ✅ devDependencies
全局安装 ⚠️ 需配置 ✅ -g 选项
工作区 ❌ 无原生支持 ✅ workspaces

与 pip (Python) 对比 #

特性 Pub pip
内置支持 ✅ Dart SDK 自带 ✅ Python 自带
锁定文件 ✅ pubspec.lock ❌ 无(需 pipenv)
虚拟环境 ⚠️ 项目隔离 ✅ venv
开发依赖 ✅ 支持 ❌ 无
可执行文件 ✅ 自动添加 ⚠️ 需要配置

与 Cargo (Rust) 对比 #

特性 Pub Cargo
构建系统集成 ⚠️ 有限 ✅ 内置
测试框架 ⚠️ 需要包 ✅ 内置
锁定文件 ✅ pubspec.lock ✅ Cargo.lock
工作区 ❌ 无原生支持 ✅ 支持
发布命令 dart pub publish cargo publish

Pub 的设计哲学 #

约定优于配置 #

Pub 采用合理的默认配置:

yaml
# 最简单的 pubspec.yaml
name: my_package
version: 1.0.0

environment:
  sdk: '>=3.0.0 <4.0.0'
# 其他字段有默认值

零配置开始 #

bash
# 创建项目后立即可以运行
dart create my_project
cd my_project
dart run
# 输出:Hello, world!

安全默认 #

  • 默认使用语义化版本约束
  • 默认启用依赖锁定
  • 默认进行安全检查

Pub 的局限 #

已知限制 #

  1. 全局缓存:所有项目共享缓存,可能造成版本冲突
  2. 依赖解析:有时解析速度较慢
  3. 私有仓库:配置相对复杂

解决方案 #

bash
# 清理缓存
dart pub cache clean

# 使用依赖覆盖
# pubspec.yaml
dependency_overrides:
  my_package: 2.0.0

# 配置私有仓库
# pubspec.yaml
dependencies:
  my_private_package:
    hosted: https://my-private-repo.com
    version: ^1.0.0

常用包推荐 #

Web 开发 #

描述
http HTTP 客户端
shelf Web 服务器框架
json_serializable JSON 序列化

Flutter 开发 #

描述
provider 状态管理
dio HTTP 客户端
shared_preferences 本地存储

工具类 #

描述
path 路径操作
args 命令行参数解析
logging 日志记录

测试 #

描述
test 测试框架
mocktail Mock 库
build_runner 代码生成

下一步 #

现在你已经了解了 Pub 的基本概念,接下来学习 安装与配置 开始实际使用 Pub!

最后更新:2026-03-28