Dart 튜토리얼 19편: 배포·버전·보안(dart pub publish·versioning·verified publishers·security advisories)
요약
핵심 요지
- 문제 정의: 패키지를 배포하면 “버전”과 “배포 파일 목록”과 “보안 취약점 대응”이 함께 따라오며, 이 중 하나라도 놓치면 사용자 신뢰를 잃기 쉽다.
- 핵심 주장: pub 배포는
dart pub publish --dry-run1으로 사전 점검한 뒤dart pub publish2로 업로드하고, 버전 범위는 caret(^) 같은 문법으로 의미를 고정하며, 보안 권고는dart pub get3 단계에서 노출되므로 반드시 확인해야 한다. - 주요 근거: dry-run이 pubspec/레이아웃 검증과 “업로드될 파일 목록 표시”를 수행하는 설명, caret 범위 설명, verified publisher 배지 의미, security advisory 출력/
ignored_advisories4 예시가 제시된다. - 실무 기준: “(1) 버전 정책(semver) → (2) dry-run으로 파일 점검 → (3) publish → (4) 보안 권고 확인/업그레이드”를 릴리즈 체크리스트로 둔다.
문서가 설명하는 범위
dart pub publish --dry-run/dart pub publish배포 절차와 검증 항목- 버전 범위(예:
'>=2.3.5 <2.4.0',^2.3.5)의 의미와 제약 해결(범위 교집합) 흐름 - verified publisher 배지의 의미와 DNS 기반 검증 개요
- security advisories가 pub 클라이언트에 표시되는 방식과 무시 목록(
ignored_advisories)
읽는 시간: 17분 | 난이도: 초급
참고 자료
문제 상황
배포는 “내 로컬에서 잘 된다”로 끝나지 않습니다.
배포 후에는 다른 개발자가 의존성으로 가져다 쓰고, 버전 범위로 업데이트가 흘러가며, 취약점이 발견되면 보안 권고가 표시됩니다.
즉, 배포는 기능보다 “절차와 신뢰”가 중요해지는 단계입니다.
해결 방법
단계 1: 버전 범위는 “의미가 있는 약속”으로 관리하기
Why
NOTE의존성 버전을 딱 하나로 고정하면, 다른 패키지와 함께 쓸 때 충돌이 생기기 쉽습니다.
그래서 pub는 “버전 범위(range)”를 사용해 제약을 풀고, 교집합을 찾아 해결하는 모델을 설명합니다.
What
NOTE버전 범위는 예를 들어 다음처럼 표현될 수 있습니다.
'>=2.3.5 <2.4.0'은 2.3.5 이상 2.4.0 미만 범위를 뜻합니다.
caret 문법^2.3.5는 2.3.5 이상 3.0.0 미만(3.0.0 포함하지 않음) 범위를 뜻하는 것으로 설명됩니다.
How
TIP버전 범위 표현 예시는 다음과 같습니다.
dependencies:collection: '>=2.3.5 <2.4.0'caret 문법 예시는 다음과 같습니다.
dependencies:collection: ^2.3.5
Watch out
WARNING범위가 너무 좁으면(잠금) 업데이트가 막히고, 범위가 너무 넓으면 호환성 문제가 생길 수 있습니다.
따라서 버전 범위는 “호환성 약속(semantic versioning)”을 전제로 잡고, 범위를 정하는 것이 기준으로 설명됩니다.
결론: 버전은 “범위”로 관리하되, 그 범위가 의미를 가지려면 semver 약속을 함께 전제로 둡니다.
단계 2: 배포 전에는 --dry-run으로 “업로드될 파일 목록”을 반드시 확인하기
Why
NOTE배포에서 흔한 실수는 “원치 않는 파일이 함께 업로드되는 것”입니다.
이 실수는 되돌리기 어렵고, 신뢰/보안에도 영향을 줄 수 있습니다.
What
NOTE
dart pub publish --dry-run은 실제 업로드 없이 배포 과정을 시뮬레이션하고, pubspec/레이아웃 검증을 수행한 뒤 업로드될 파일 목록을 보여준다고 설명됩니다.
How
TIPdry-run 명령은 다음과 같습니다.
Terminal window $ dart pub publish --dry-run파일 목록 예시는 다음과 같이 제시됩니다.
Publishing transmogrify 1.0.0.gitignoreCHANGELOG.mdREADME.mdlibtransmogrify.dartsrctransmogrifier.darttransmogrification.dartpubspec.yamltesttransmogrify_test.dartPackage has 0 warnings.
Watch out
WARNING원치 않는 파일이 보이면 업로드를 취소하고,
.pubignore5 또는.gitignore6로 제외하거나 파일을 제거하는 흐름이 제시됩니다.
결론: 배포는 --dry-run으로 파일 목록까지 확인한 뒤 진행합니다.
단계 3: dart pub publish는 검증 후 업로드하며, verified publisher는 “발행자 신원 표시”다
Why
NOTE사용자는 패키지의 출처를 신뢰하고 싶어 합니다.
또한 배포 명령은 “검증 → 업로드” 절차를 포함해야 실수를 줄일 수 있습니다.
What
NOTE
dart pub publish는 pubspec/레이아웃 검증,git status가 깨끗한지 확인, 업로드 파일 목록 표시, 그리고 pub.dev 업로드까지 수행한다고 설명됩니다.
verified publisher 배지7는 pub.dev가 발행자 신원을 확인했음을 나타내는 표시로 설명됩니다.
How
TIP배포 명령은 다음과 같습니다.
Terminal window $ dart pub publish
Watch out
WARNING새 패키지를 verified publisher로 “직접” 배포하는 기능은 pub 명령이 지원하지 않는다는 안내가 함께 제시됩니다.
즉, 배포 흐름을 구성할 때 이 제약을 고려해야 합니다.
결론: 배포는 dart pub publish가 수행하는 검증 절차를 믿되, 발행자 신원(verified publisher)과 제약 사항은 별도로 이해해야 합니다.
단계 4: 보안 권고는 dart pub get에서 노출되며, 필요하면 ignored_advisories로 처리한다
Why
NOTE취약한 의존성을 그대로 두면, 앱과 사용자에게 위험이 될 수 있습니다.
그래서 의존성 해결 단계에서 보안 권고를 확인하는 흐름이 제시됩니다.
What
NOTEsecurity advisory는 GitHub Advisory Database를 사용하며,
dart pub get단계에서 영향을 받는 의존성이 출력될 수 있다고 설명됩니다.
또한 루트 패키지의pubspec.yaml8에ignored_advisories를 넣어 경고를 무시할 수 있는 방식이 제시됩니다.
How
TIP
dart pub get출력 예시는 다음과 같이 제시됩니다.Terminal window $ dart pub getResolving dependencies...http 0.13.0 (affected by advisory: [^0], 1.2.0 available)Got dependencies!Dependencies are affected by security advisories:[^0]: https://github.com/advisories/GHSA-4rgh-jx4f-qfcq무시 목록 예시는 다음과 같습니다.
name: myappdependencies:foo: ^1.0.0ignored_advisories:- GHSA-4rgh-jx4f-qfcq
Watch out
WARNING무시 목록은 “루트 패키지에만 적용”된다고 설명됩니다.
즉, 의존성 내부에서 무시하더라도 내 프로젝트의 해결 결과에는 적용되지 않을 수 있으므로 범위를 정확히 이해해야 합니다.
결론: 보안 권고는 dart pub get 단계에서 확인하고, 무시가 필요하면 ignored_advisories의 적용 범위를 이해한 뒤 설정합니다.
Footnotes
-
dart pub publish —dry-run(dry-run): 실제 업로드 없이 배포 과정을 검증하고 업로드 파일 목록을 보여주는 명령이다. ↩
-
dart pub publish(pub publish): 패키지를 pub.dev에 업로드하는 명령이다. ↩
-
dart pub get(pub get): 의존성을 해결하고 내려받는 명령이다. ↩
-
ignored_advisories(무시할 보안 권고 목록): 특정 보안 권고 경고를 무시하도록 하는 pubspec 필드다. ↩
-
.pubignore(.pubignore): 배포에서 제외할 파일을 지정하는 ignore 파일이다. ↩
-
.gitignore(.gitignore): Git에서 무시할 파일을 지정하는 ignore 파일이다. ↩
-
verified publisher(검증된 발행자): pub.dev가 발행자 신원을 검증했음을 나타내는 배지/개념이다. ↩
-
pubspec.yaml(pubspec): 패키지 메타데이터와 의존성을 선언하는 파일이다. ↩
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!