dart pub outdated

dart pub outdated

dart pub outdated는 pub 도구의 명령어 중 하나예요. 이 명령어로 오래된(out-of-date) 패키지 의존성을 찾아내고, 어떻게 업데이트할지에 대한 조언을 얻을 수 있어요. 의존성 관리의 모범 사례 중 하나가 가장 최신의 안정 패키지 버전을 사용하는 것인데, 그래야 최신 버그 수정과 개선 사항을 받을 수 있기 때문이에요.

$ dart pub outdated [options]

출처: dart pub outdated

본문

개요

dart pub outdated를 활용해 내가 소유한 패키지(앱이든 일반 패키지든)의 의존성을 업데이트하는 방법은 이렇게 진행해요:

  • 패키지에 pubspec.lock 파일이 소스 컨트롤에 체크인되어 있지 않다면, 패키지 최상위 디렉터리(즉 pubspec.yaml 파일이 있는 디렉터리)에서 dart pub get을 실행해요.
  • dart pub outdated를 실행해서 어떤 패키지 의존성이 오래되었는지 확인해요. 영향을 받는 패키지들을 기록해 두세요. 나중에 그 패키지들을 쓰는 코드의 동작을 테스트할 때 필요하니까요.
  • dart pub outdated의 권장 사항을 따라 패키지를 업데이트해요. 어떤 업데이트는 dart pub upgrade만 실행하면 되고, 다른 업데이트는 dart pub upgrade를 실행하기 전에 pubspec.yaml을 먼저 수정해야 할 수도 있어요.
  • 호환되는 최신 패키지 버전을 사용하고 있는지 확인하기 위해 dart pub outdated를 다시 실행해요.
  • 패키지를 테스트해서 예상대로 여전히 동작하는지 확인해요.

전이적 의존성(Transitive dependency — 어떤 패키지가 다른 의존성을 필요로 해서 간접적으로 사용하게 되는 의존성) 때문에 여전히 오래된 의존성이 남아 있을 수도 있어요. 원인을 파악하려면 dart pub deps를 실행하고 출력에서 오래된 각 패키지의 이름을 찾아보세요.

예제

여러 오래된 의존성을 가진 예제에서 dart pub outdated를 실행한 모습이에요. 의존성 세 개(args, http, path)는 직접 의존성이고 하나(meta)는 전이적 의존성이에요. 아래 예제처럼 dart pub outdated는 명령줄에서 실행하면 기본적으로 출력에 색을 입혀요.

$ dart pub outdated

Package Name  Current    Upgradable  Resolvable  Latest

direct dependencies:
args          1.4.4      1.6.0       1.6.0       1.6.0
http          0.11.3+17  0.11.3+17   0.12.1      0.12.1
path          1.6.2      1.6.2       1.6.2       1.7.0

dev_dependencies: all up-to-date

transitive dependencies:
meta          1.1.6      1.1.6       1.1.6       1.1.8

transitive dev_dependencies: all up-to-date

1 upgradable dependency is locked (in pubspec.lock) to an older version.
To update it, use `dart pub upgrade`.

1 dependency is constrained to a version that is older than a resolvable version.
To update it, edit pubspec.yaml.

Resolvable 열은 각 오래된 의존성에 대해 업그레이드할 수 있는 버전을 보여줘요. 빨간색이 아닌 값을 가진 가장 왼쪽 열을 찾으면 더 많은 정보를 얻을 수 있어요. 예를 들어 args는 1.6.0으로 업그레이드할 수 있고, http는 0.12.1로 해석할 수 있어요. pathmeta는 최신 버전은 아니지만, 다른 모든 의존성을 고려했을 때 가장 최신으로 해석 가능한 버전이에요.

upgradable로 나열된 첫 번째 의존성(args)을 고치려면 dart pub upgrade만 실행하면 돼요.

$ dart pub upgrade
Resolving dependencies...
> args 1.6.0 (was 1.4.4)
  ...
Changed 1 dependency!

resolvable로 나열된 두 번째 의존성(http)을 고치려면 pubspec의 http 항목을 Resolvable 열의 버전(또는 호환되는 그보다 높은 버전)으로 바꾸면 돼요. 캐럿(caret) 문법으로는 ^0.12.1이에요. pubspec.yaml의 diff는 이렇게 생겼어요.

-  http: ^0.11.0
+  http: ^0.12.1

pubspec.yaml을 편집한 뒤 dart pub upgrade를 실행해서 pubspec.lock 파일을 업데이트해요. 그런 다음 dart pub outdated를 실행해서 필요한 변경을 모두 했는지 확인할 수 있어요. 이 예제에서 pathmeta는 다른 의존성에 의해 결정된 제약 때문에 여전히 오래된 상태예요.

$ dart pub upgrade
...
$ dart pub outdated
Package Name  Current  Upgradable  Resolvable  Latest

direct dependencies:
path          1.6.2    1.6.2       1.6.2       1.7.0

dev_dependencies: all up-to-date

transitive dependencies:
meta          1.1.6    1.1.6       1.1.6       1.1.8

transitive dev_dependencies: all up-to-date

Dependencies are all on the latest resolvable versions.
Newer versions, while available, are not mutually compatible.

이 패키지들이 왜 오래되었는지 알아보려면 dart pub deps를 실행해서 이 패키지들에 대한 의존성을 찾아보면 돼요.

$ dart pub deps -s list
...
dependencies:
...
- terminal_tools 0.1.0
  - path 1.6.2
  - meta 1.1.6
...

앞의 출력에서 볼 수 있듯이 이 패키지는 terminal_tools 패키지에 의존하는데, 그 패키지가 오래된 pathmeta 버전에 의존하고 있어요. terminal_tools 패키지가 업데이트되면 이 패키지도 업데이트할 수 있을 거예요.

출력 열

dart pub outdated의 출력에는 각 오래된 의존성에 대한 네 개의 버전 정보 열이 있어요. 네 개의 버전 열을 보여주는 예제 출력의 일부는 이렇게 돼요: Current, Upgradable, Resolvable, Latest.

Package Name  Current    Upgradable  Resolvable  Latest

direct dependencies:
args          1.4.4      1.6.0       1.6.0       1.6.0
http          0.11.3+17  0.11.3+17   0.12.1      0.12.1
path          1.6.2      1.6.2       1.6.2       1.7.0

dev_dependencies: all up-to-date

transitive dependencies:
meta          1.1.6      1.1.6       1.1.6       1.1.8
  • Current: pubspec.lock에 기록된, 패키지에서 사용 중인 버전이에요. 패키지가 pubspec.lock에 없다면 값은 -예요.
  • Upgradable: pubspec.yaml 파일이 허용하는 최신 버전이에요. dart pub upgrade가 해석하는 버전이죠. Current 열의 값이 -라면 이 값도 -예요.
  • Resolvable: 다른 모든 의존성과 결합했을 때 해석할 수 있는 최신 버전이에요. pubspec.yaml의 모든 버전 제약이 무제한(bounded)일 때 dart pub upgrade가 주는 버전에 해당해요. 값이 -면 그 패키지는 필요하지 않다는 뜻이에요.
  • Latest: prerelease를 제외하고 사용 가능한 패키지의 최신 버전이에요. --prereleases 옵션을 쓰면 prerelease를 포함해요.

예를 들어 앱이 foobar 패키지에 의존하는데 bar의 최신 버전이 foo의 오래된 메이저 버전만 허용한다고 해 봐요. 그러면 foo의 최신 해석 가능 버전이 foo의 최신 버전과 달라져요.

pubspec.yaml 파일을 편집할 때는 보통 dependencies와 dev_dependencies 섹션을 업데이트해서 각 패키지가 Resolvable 열의 버전을 사용하도록 해요.

옵션

모든 pub 명령어에 공통으로 적용되는 옵션은 Global options 문서를 참고하세요.

--[no-]dependency-overrides

기본적으로 패키지 제약을 해석할 때 dependency_overrides를 고려해요(--dependency-overrides). override를 고려하지 않으려면 --no-dependency-overrides를 써요.

--[no-]dev-dependencies

기본적으로 패키지 제약을 해석할 때 dev dependencies를 고려해요(--dev-dependencies). dev dependencies를 고려하지 않으려면 --no-dev-dependencies를 써요.

--json

출력을 JSON 형식으로 생성해요.

--[no-]prereleases

기본적으로 마지막 패키지 버전을 결정할 때 prerelease를 포함해요(--prereleases). prerelease를 고려하지 않으려면 --no-prereleases를 써요.

--[no-]transitive

기본적으로 출력에 전이적 의존성(Transitive dependency)을 포함하지 않아요(--no-transitive). 전이적 의존성을 포함하려면 --transitive를 써요.

--[no-]up-to-date

기본적으로 최신 버전인 의존성은 포함하지 않아요(--no-up-to-date). 최신 의존성도 포함하려면 --up-to-date를 써요.

워크스페이스 안에서

Pub 워크스페이스에서 dart pub outdated는 모든 의존성을 나열해요.

더 알아보기