Pub 发布包 #

发布概述 #

pub.dev 平台 #

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

  • 包托管和分发
  • 版本管理
  • 文档托管
  • 包评分系统
  • 搜索和发现

发布前准备 #

1. 检查项目结构 #

确保项目结构完整:

text
my_package/
├── pubspec.yaml       # 必需
├── README.md          # 必需
├── CHANGELOG.md       # 必需
├── LICENSE            # 必需
├── lib/
│   └── my_package.dart
├── test/
│   └── my_package_test.dart
└── example/
    └── example.dart

2. 完善 pubspec.yaml #

yaml
name: my_package
version: 1.0.0
description: 的包发布指南,涵盖发布前准备、pubspec 配置、发布流程、版本管理、撤回发布等,成功发布包到 pub.dev。
homepage: https://example.com
repository: https://github.com/user/my_package
issue_tracker: https://github.com/user/my_package/issues
documentation: https://docs.example.com
license: MIT

environment:
  sdk: '>=3.0.0 <4.0.0'

dependencies:
  http: ^1.0.0

dev_dependencies:
  test: ^1.24.0
  lints: ^2.0.0

3. 编写 README.md #

README 是包的门面,应包含:

markdown
# my_package

A clear and concise description of what your package does.

## Features

- Feature 1
- Feature 2
- Feature 3

## Getting started

Add the package to your `pubspec.yaml`:

```yaml
dependencies:
  my_package: ^1.0.0

Usage #

dart
import 'package:my_package/my_package.dart';

void main() {
  // Example usage
}

Additional information #

text

### 4. 编写 CHANGELOG.md

记录每个版本的变更:

```markdown
# Changelog

All notable changes to this project will be documented in this file.

## 1.0.0

- Initial release
- Feature 1 added
- Feature 2 added

## 0.2.0

- Breaking change: API refactored
- Feature 3 added

## 0.1.0

- Initial development release

5. 添加 LICENSE #

选择合适的开源许可证:

text
MIT License

Copyright (c) 2024 Your Name

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

6. 添加示例代码 #

example/ 目录下添加示例:

dart
// example/example.dart
import 'package:my_package/my_package.dart';

void main() {
  // Demonstrate package usage
  final result = myFunction();
  print(result);
}

7. 编写测试 #

确保测试覆盖率:

dart
// test/my_package_test.dart
import 'package:test/test.dart';
import 'package:my_package/my_package.dart';

void main() {
  group('MyPackage', () {
    test('should do something', () {
      expect(myFunction(), equals(expectedResult));
    });
  });
}

发布流程 #

1. 验证包 #

bash
# 干运行(检查但不发布)
dart pub publish --dry-run

输出示例:

text
Publishing my_package 1.0.0 to https://pub.dev:
|-- .gitignore
|-- CHANGELOG.md
|-- LICENSE
|-- README.md
|-- analysis_options.yaml
|-- example
|   '-- example.dart
|-- lib
|   |-- my_package.dart
|   '-- src
|       '-- implementation.dart
|-- pubspec.yaml
'-- test
    '-- my_package_test.dart

Total 11 files / 5.2 KB
Package has 0 warnings.

2. 登录 pub.dev #

bash
# 登录 Google 账号
dart pub login

浏览器会打开登录页面,完成授权后返回终端。

3. 发布包 #

bash
# 发布到 pub.dev
dart pub publish

# 跳过确认
dart pub publish --force

4. 验证发布 #

bash
# 访问包页面
open https://pub.dev/packages/my_package

版本管理 #

语义化版本 #

遵循语义化版本规范:

text
MAJOR.MINOR.PATCH

1.0.0 → 1.0.1  # PATCH:bug 修复
1.0.1 → 1.1.0  # MINOR:新功能
1.1.0 → 2.0.0  # MAJOR:破坏性变更

版本更新流程 #

bash
# 1. 更新代码
# 编辑文件...

# 2. 更新 CHANGELOG.md
# 添加变更记录

# 3. 更新版本号
# 编辑 pubspec.yaml 中的 version

# 4. 运行测试
dart test

# 5. 干运行
dart pub publish --dry-run

# 6. 发布
dart pub publish

预发布版本 #

yaml
# pubspec.yaml
version: 1.0.0-alpha.1
version: 1.0.0-beta.1
version: 1.0.0-rc.1

预发布版本不会自动更新为稳定版本:

yaml
dependencies:
  my_package: ^1.0.0-alpha.1  # 需要显式指定

包评分 #

pub.dev 会为包计算评分,包括:

评分维度 #

维度 权重 说明
Documentation 20% 文档覆盖率
Platform support 20% 平台支持
Analysis 40% 静态分析
Dependencies 10% 依赖健康度
Null safety 10% 空安全支持

提高评分 #

1. 文档覆盖率 #

dart
/// A class that does something useful.
///
/// This class provides functionality for...
class MyClass {
  /// Creates a new instance of [MyClass].
  MyClass(this.value);

  /// The value of this instance.
  final int value;

  /// Does something with [value].
  void doSomething() {
    // ...
  }
}

2. 平台支持 #

yaml
# pubspec.yaml
platforms:
  android:
  ios:
  web:
  windows:
  macos:
  linux:

3. 静态分析 #

yaml
# analysis_options.yaml
include: package:lints/recommended.yaml

linter:
  rules:
    - avoid_print
    - prefer_single_quotes

4. 空安全 #

yaml
# pubspec.yaml
environment:
  sdk: '>=2.17.0 <4.0.0'

5. 示例代码 #

dart
// example/example.dart
import 'package:my_package/my_package.dart';

void main() {
  // 完整的示例代码
}

发布检查清单 #

发布前 #

  • [ ] pubspec.yaml 完整且正确
  • [ ] README.md 清晰描述包的功能
  • [ ] CHANGELOG.md 记录版本变更
  • [ ] LICENSE 文件存在
  • [ ] 测试通过
  • [ ] 示例代码可运行
  • [ ] 文档注释完整
  • [ ] 无 lint 警告

发布时 #

  • [ ] 干运行成功
  • [ ] 版本号正确
  • [ ] 登录 pub.dev

发布后 #

  • [ ] 验证包页面
  • [ ] 测试安装
  • [ ] 宣传包

撤回发布 #

撤回条件 #

  • 发布后 72 小时内
  • 包下载量较少

撤回流程 #

bash
# 撤回特定版本
dart pub unpublish my_package 1.0.0

# 撤回整个包
dart pub unpublish my_package

废弃包 #

如果无法撤回,可以废弃:

bash
# 废弃特定版本
dart pub deprecate my_package 1.0.0 "Use 1.1.0 instead"

# 废弃整个包
dart pub deprecate my_package "This package is deprecated. Use other_package instead"

发布到私有仓库 #

配置私有仓库 #

bash
# 发布到私有仓库
dart pub publish --server=https://my-private-repo.com

配置认证 #

bash
# 添加认证令牌
dart pub token add https://my-private-repo.com

常见问题 #

1. 包名已存在 #

bash
# 错误信息
Package name already exists

# 解决方案
# 更改包名
name: my_unique_package_name

2. 版本号未更新 #

bash
# 错误信息
Version 1.0.0 already exists

# 解决方案
# 更新版本号
version: 1.0.1

3. 文件过大 #

bash
# 错误信息
Package size exceeds limit

# 解决方案
# 使用 .gitignore 排除不必要的文件
# 或使用 .pubignore

4. 缺少必要文件 #

bash
# 错误信息
Missing required files

# 解决方案
# 添加 README.md, CHANGELOG.md, LICENSE

5. 平台不支持 #

bash
# 错误信息
Platform not supported

# 解决方案
# 在 pubspec.yaml 中声明平台
platforms:
  android:
  ios:
  web:

发布最佳实践 #

1. 使用 CI/CD 自动发布 #

yaml
# .github/workflows/publish.yml
name: Publish to pub.dev

on:
  push:
    tags:
      - 'v*'

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dart-lang/setup-dart@v1
      - name: Install dependencies
        run: dart pub get
      - name: Run tests
        run: dart test
      - name: Publish
        run: dart pub publish --force
        env:
          PUB_TOKEN: ${{ secrets.PUB_TOKEN }}

2. 使用 melos 管理多包 #

yaml
# melos.yaml
name: my_monorepo

packages:
  - 'packages/*'

scripts:
  publish:
    run: melos exec -- dart pub publish --force

3. 版本管理策略 #

text
开发阶段:0.x.x
稳定版本:1.x.x
预发布:1.0.0-alpha.1, 1.0.0-beta.1

4. 保持向后兼容 #

dart
// 使用 @Deprecated 标记废弃 API
@Deprecated('Use newMethod instead')
void oldMethod() {
  newMethod();
}

void newMethod() {
  // 新实现
}

5. 提供迁移指南 #

CHANGELOG.md 中提供详细的迁移指南:

markdown
## 2.0.0

### Breaking changes

- `oldMethod()` has been removed. Use `newMethod()` instead.

### Migration guide

```dart
// Before
oldMethod();

// After
newMethod();
text

## 包维护

### 定期更新

```bash
# 检查依赖更新
dart pub outdated

# 更新依赖
dart pub upgrade

# 运行测试
dart test

# 发布更新
dart pub publish

响应 Issue #

  • 及时回复 GitHub Issue
  • 修复 bug 并发布补丁版本
  • 记录变更到 CHANGELOG.md

持续改进 #

  • 收集用户反馈
  • 添加新功能
  • 改进文档
  • 提高测试覆盖率

下一步 #

现在你已经了解了如何发布包,接下来学习 高级特性 探索更多 Pub 的高级功能!

最后更新:2026-03-28