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 的局限 #
已知限制 #
- 全局缓存:所有项目共享缓存,可能造成版本冲突
- 依赖解析:有时解析速度较慢
- 私有仓库:配置相对复杂
解决方案 #
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