dart pub upgrade
dart pub upgrade
dart pub upgrade는 pub 도구의 명령어 중 하나예요. dart pub get과 비슷하게 의존성을 가져오는데, 차이는 dart pub upgrade가 기존의 lockfile(Lockfile — 각 의존성의 버전을 지정하는 pubspec.lock 파일)을 무시하고 모든 의존성의 최신 버전을 가져올 수 있게 한다는 점이에요. 관련된 명령어로는 오래된 의존성을 찾아내는 dart pub outdated가 있어요.
$ dart pub upgrade [options] [dependencies]
인자를 주지 않으면 dart pub upgrade는 현재 작업 디렉터리의 pubspec.yaml에 나열된 모든 의존성과 그 전이적 의존성(Transitive dependency — 어떤 패키지가 다른 의존성을 필요로 해서 간접적으로 사용하게 되는 의존성)의 최신 버전을 가져와요. 예를 들어:
$ dart pub upgrade
Dependencies upgraded!
dart pub upgrade가 의존성 버전을 올리면 lockfile을 써서, 이후 dart pub get이 같은 버전의 의존성들을 사용하도록 보장해요. 애플리케이션 패키지(Application package — 실행 가능한 애플리케이션을 담은 Dart 패키지)라면 lockfile을 소스 컨트롤에 체크인하세요. 그래야 모든 개발자와 프로덕션 배포에서 정확히 같은 버전의 의존성을 사용하게 돼요. 일반 패키지라면 lockfile은 체크인하지 않아요. 패키지는 다양한 범위의 의존성 버전과 함께 동작하도록 기대되기 때문이에요.
lockfile이 이미 존재해도 dart pub upgrade는 이를 무시하고 모든 의존성의 최신 버전으로 새 lockfile을 처음부터 다시 생성해요.
패키지 해석과 시스템 패키지 캐시에 대한 자세한 내용은 dart pub get 문서를 참고하세요.
출처: dart pub upgrade
본문
특정 의존성 업그레이드
dart pub upgrade에 특정 의존성을 지정하면, 나머지 의존성은 가능한 한 그대로 두면서 지정한 의존성만 최신 버전으로 올릴 수 있어요. 예를 들어:
$ dart pub upgrade test args
Dependencies upgraded!
보통 다른 의존성은 업그레이드되지 않고 lockfile에 잠긴 버전 그대로 유지돼요. 그런데 요청한 업그레이드가 이 잠긴 버전들과 충돌을 일으키면, 호환되는 버전 조합을 찾을 때까지 일부만 선택적으로 잠금을 풀어요.
즉 특정 의존성을 업그레이드한다고 해서 기본적으로 그 전이적 의존성까지 업그레이드되지는 않아요.
특정 의존성과 그 모든 전이적 의존성을 최신 버전으로 올리려면 --unlock-transitive 플래그를 사용해요.
$ dart pub upgrade --unlock-transitive test args
새 의존성 가져오기
dart pub upgrade를 실행하기 전에 pubspec에 의존성을 추가하면, 그 새 의존성과 그 전이적 의존성을 함께 가져와요. 이는 dart pub get과 같은 동작이에요.
의존성 제거
dart pub upgrade를 실행하기 전에 pubspec에서 의존성을 제거하면, 그 의존성은 더 이상 import할 수 없어요. 제거한 의존성의 전이적 의존성 중에서 남아 있는 직접 의존성이 더 이상 참조하지 않는 것들도 함께 제거돼요. 이것 역시 dart pub get과 같은 동작이에요.
오프라인 업그레이드
네트워크에 접속하지 못해도 dart pub upgrade를 실행할 수 있어요. pub은 패키지를 시스템의 모든 패키지가 공유하는 중앙 캐시에 다운로드하기 때문에, 네트워크 없이도 이전에 다운로드한 패키지를 찾는 경우가 많아요.
다만 기본적으로 dart pub upgrade는 호스팅된 의존성이 있으면 온라인으로 접속을 시도해서, 의존성의 새 버전을 감지하려 해요. 그렇게 하지 않으려면 --offline 플래그를 전달해요. 오프라인 모드에서 pub은 로컬 패키지 캐시만 살펴보며, 이미 사용 가능한 버전들 중에서 패키지와 함께 동작하는 조합을 찾으려 해요.
한 가지 유의할 점은 pub이 lockfile을 생성한다는 거예요. 캐시에 있는 어떤 의존성의 버전이 우연히 오래된 버전뿐이라면, 오프라인 dart pub upgrade는 앱을 그 오래된 버전에 잠가버려요. 다음에 온라인 상태가 되면 더 최신 버전으로 올리기 위해 dart pub upgrade를 다시 실행하는 게 좋아요.
옵션
dart pub upgrade 명령어는 dart pub get의 옵션들을 지원하고, 그 외의 옵션도 더 지원해요. 모든 pub 명령어에 공통으로 적용되는 옵션은 Global options 문서를 참고하세요.
--[no-]offline
기본적으로 pub은 네트워크에 연결해서 호스팅된 패키지를 가져와요(--no-offline). 캐시된 패키지를 대신 사용하려면 --offline을 써요. 자세한 내용은 Getting while offline을 참고하세요.
--dry-run 또는 -n
변경될 의존성을 보고만 하고 실제로는 변경하지 않아요. 업데이트를 적용하기 전에 분석하고 싶을 때 유용해요.
--[no-]precompile
기본적으로 pub은 직접 의존성의 실행 파일들을 미리 컴파일해요(--precompile). 미리 컴파일하지 않으려면 --no-precompile을 써요.
--[no-]example
기본적으로 pub은 그 패키지의 example/ 디렉터리의 의존성도 함께 업그레이드해요(--example). 예시 의존성 업그레이드를 건너뛰려면 --no-example을 써요.
--major-versions
dart pub outdated가 resolvable로 나열하는 패키지들을 가져오되, pubspec.yaml의 상한 제약(upper-bound constraint)을 무시해요. 그리고 pubspec.yaml을 새 제약으로 업데이트해요.
어떤 의존성이 업그레이드될지 확인하려면 dart pub upgrade --major-versions --dry-run을 쓸 수 있어요.
--tighten
pubspec.yaml의 의존성 하한(lower bound)을 해석된 버전에 맞춰 업데이트하고, 변경된 제약 목록을 반환해요. 특정 의존성에만 적용할 수도 있어요.
--unlock-transitive
잠금을 풀 패키지 목록과 함께 사용하면, 먼저 그 패키지들의 의존성 전이 폐포(transitive closure, 현재 해석 기준)를 계산한 뒤 그 모든 패키지의 잠금을 풀어요.
워크스페이스 안에서
Pub 워크스페이스에서 dart pub upgrade는 워크스페이스의 모든 패키지에 걸쳐 공유된 해석(shared resolution)의 모든 의존성을 업그레이드해요.
dart pub upgrade --major-versions와 dart pub upgrade --tighten은 워크스페이스의 모든 pubspec.yaml 파일의 제약을 업데이트해요.
더 알아보기
- dart pub outdated — 오래된 의존성 찾기
- dart pub get — 의존성을 가져오는 명령어
- Package dependencies — 의존성 관리와 베스트 프랙티스