패키지 배포 — pub.dev에 나만의 패키지 올리기
패키지 배포 — pub.dev에 나만의 패키지 올리기
자주 사용하는 유틸리티나 위젯을 패키지로 만들어 pub.dev에 배포하면 커뮤니티에 기여할 수 있고, 포트폴리오에도 좋습니다. 패키지 생성부터 배포까지의 전 과정을 정리해보겠습니다.
패키지 생성
# Dart 패키지 (순수 Dart 라이브러리)
dart create -t package my_utils
# Flutter 패키지 (Flutter 위젯 포함)
flutter create --template=package my_flutter_widgets
# Flutter 플러그인 (네이티브 코드 포함)
flutter create --template=plugin --platforms=android,ios my_plugin
디렉토리 구조
my_utils/
├── lib/
│ ├── my_utils.dart # 패키지 진입점 (export 모음)
│ └── src/
│ ├── string_utils.dart # 내부 구현
│ └── date_utils.dart
├── test/
│ ├── string_utils_test.dart
│ └── date_utils_test.dart
├── example/ # 사용 예제
│ └── main.dart
├── pubspec.yaml
├── README.md
├── CHANGELOG.md
├── LICENSE
└── analysis_options.yaml
pubspec.yaml 설정
name: my_utils
description: 유용한 Dart 유틸리티 모음. String 확장, 날짜 포맷팅 등을 제공합니다.
version: 1.0.0
homepage: https://github.com/username/my_utils
repository: https://github.com/username/my_utils
issue_tracker: https://github.com/username/my_utils/issues
documentation: https://github.com/username/my_utils/wiki
environment:
sdk: ^3.0.0
flutter: ">=3.10.0" # Flutter 패키지인 경우
dependencies:
# 최소한의 의존성만 추가
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^4.0.0
# Flutter 패키지인 경우
flutter:
# 에셋이 있으면 추가
패키지 코드 작성
진입점 (lib/my_utils.dart)
/// 유용한 Dart 유틸리티 모음
library my_utils;
// 공개할 API만 export
export 'src/string_utils.dart';
export 'src/date_utils.dart';
// src/ 내부의 다른 파일은 export하지 않으면 비공개
구현 (lib/src/string_utils.dart)
/// String 확장 메서드 모음
extension StringExtension on String {
/// 첫 글자를 대문자로 변환
///
/// ```dart
/// 'hello'.capitalize; // 'Hello'
/// ''.capitalize; // ''
/// ```
String get capitalize {
if (isEmpty) return this;
return '${this[0].toUpperCase()}${substring(1)}';
}
/// 이메일 형식인지 확인
bool get isValidEmail {
return RegExp(
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
).hasMatch(this);
}
/// 한국 전화번호 형식인지 확인
bool get isValidKoreanPhone {
return RegExp(r'^01[016789]\d{7,8}$').hasMatch(replaceAll('-', ''));
}
}
문서 주석 (Dart Doc)
/// API 문서는 `///`로 작성
/// 코드 예제는 ```dart``` 블록으로 포함
/// pub.dev에서 자동으로 API 문서가 생성됨
테스트 작성
// test/string_utils_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:my_utils/my_utils.dart';
void main() {
group('StringExtension', () {
test('capitalize', () {
expect('hello'.capitalize, equals('Hello'));
expect(''.capitalize, equals(''));
expect('A'.capitalize, equals('A'));
});
test('isValidEmail', () {
expect('test@email.com'.isValidEmail, isTrue);
expect('invalid-email'.isValidEmail, isFalse);
expect(''.isValidEmail, isFalse);
});
});
}
예제 작성
// example/main.dart
import 'package:my_utils/my_utils.dart';
void main() {
// String 확장
print('hello world'.capitalize); // Hello world
print('test@email.com'.isValidEmail); // true
print('01012345678'.isValidKoreanPhone); // true
}
배포 전 체크리스트
# 1. 정적 분석
dart analyze
# 2. 포맷팅
dart format .
# 3. 테스트
dart test # 또는 flutter test
# 4. 배포 점수 확인 (dry run)
dart pub publish --dry-run
필수 파일
README.md: 사용법, 설치 방법, 예제CHANGELOG.md: 버전별 변경사항LICENSE: 라이선스 (MIT, BSD 등)example/: 사용 예제
pub.dev 점수 기준
| 항목 | 배점 | 포인트 |
|---|---|---|
| Follow conventions | 30 | 패키지 구조, 포맷팅 |
| Documentation | 20 | API 문서, README |
| Platform support | 20 | 지원 플랫폼 수 |
| Pass analysis | 30 | 정적 분석 통과 |
배포
# Google 계정 인증 후 배포
dart pub publish
# 처음 배포 시 pub.dev 게시자 확인 과정 필요
한 번 배포한 버전은 **삭제할 수 없습니다 **. 신중하게 배포하세요.
버전 관리 (Semantic Versioning)
MAJOR.MINOR.PATCH
1.2.3
MAJOR: 호환되지 않는 API 변경
MINOR: 하위 호환되는 기능 추가
PATCH: 하위 호환되는 버그 수정
# CHANGELOG.md
## 1.1.0
- 한국 전화번호 검증 추가
- isValidEmail 정규식 개선
## 1.0.0
- 초기 릴리스
- String 확장 메서드: capitalize, isValidEmail
정리
dart create -t package또는flutter create --template=package로 패키지를 생성합니다lib/src/에 구현,lib/패키지명.dart에서 export합니다///문서 주석으로 API 문서를 작성하세요 (pub.dev에서 자동 생성)dart pub publish --dry-run으로 배포 전 점수를 확인합니다- 한 번 배포한 버전은 삭제 불가하니 신중하게 진행하세요
- Semantic Versioning을 지켜 사용자에게 변경 범위를 알려주세요
댓글 로딩 중...