패키지 배포 — pub.dev에 나만의 패키지 올리기

자주 사용하는 유틸리티나 위젯을 패키지로 만들어 pub.dev에 배포하면 커뮤니티에 기여할 수 있고, 포트폴리오에도 좋습니다. 패키지 생성부터 배포까지의 전 과정을 정리해보겠습니다.


패키지 생성

BASH
# 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

디렉토리 구조

PLAINTEXT
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 설정

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
/// 유용한 Dart 유틸리티 모음
library my_utils;

// 공개할 API만 export
export 'src/string_utils.dart';
export 'src/date_utils.dart';
// src/ 내부의 다른 파일은 export하지 않으면 비공개

구현 (lib/src/string_utils.dart)

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)

DART
/// API 문서는 `///`로 작성
/// 코드 예제는 ```dart``` 블록으로 포함
/// pub.dev에서 자동으로 API 문서가 생성됨

테스트 작성

DART
// 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);
    });
  });
}

예제 작성

DART
// 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
}

배포 전 체크리스트

BASH
# 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 conventions30패키지 구조, 포맷팅
Documentation20API 문서, README
Platform support20지원 플랫폼 수
Pass analysis30정적 분석 통과

배포

BASH
# Google 계정 인증 후 배포
dart pub publish

# 처음 배포 시 pub.dev 게시자 확인 과정 필요

한 번 배포한 버전은 **삭제할 수 없습니다 **. 신중하게 배포하세요.


버전 관리 (Semantic Versioning)

PLAINTEXT
MAJOR.MINOR.PATCH
1.2.3

MAJOR: 호환되지 않는 API 변경
MINOR: 하위 호환되는 기능 추가
PATCH: 하위 호환되는 버그 수정
YAML
# 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을 지켜 사용자에게 변경 범위를 알려주세요
댓글 로딩 중...