dart pub get으로 의존성 가져오기

dart pub get으로 의존성 가져오기

dart pub get 명령어를 쓰면 Dart 애플리케이션이 사용하는 의존성을 가져올 수 있어요. pubspec.yaml에 있는 모든 의존성과 전이 의존성을 받아오면서 lockfile과 패키지 캐시가 어떻게 동작하는지도 함께 알아볼게요.

출처: dart pub get

본문

dart pub get는 pub 도구의 명령어 중 하나예요. 이 명령어는 현재 작업 디렉터리의 pubspec.yaml 파일에 나열된 모든 의존성과 그 전이 의존성을 가져와요. 예를 들어:

$ dart pub get
Resolving dependencies...
Got dependencies!

시스템 캐시에 의존성이 아직 없다면 dart pub get은 캐시를 갱신하고 필요하면 의존성을 다운로드해요. 패키지를 시스템 캐시에 연결하기 위해 이 명령어는 .dart_tool/ 디렉터리에 package_config.json 파일을 만들어요.

의존성을 가져온 뒤에는 Dart 코드에서 참조할 수 있어요. 예를 들어 패키지가 test에 의존한다면:

import 'package:test/test.dart';

dart pub get이 새 의존성을 가져올 때는 lockfile을 작성해서, 앞으로도 같은 버전의 의존성을 사용하게 해요. 애플리케이션 패키지는 lockfile을 소스 관리에 커밋해야 해요. 그래야 모든 개발자와 프로덕션 배포 환경에서 정확히 같은 버전의 의존성을 사용할 수 있거든요. 다만 일반 패키지(라이브러리)는 다양한 의존성 버전과 함께 동작해야 하므로 lockfile을 커밋하지 않아요.

lockfile이 이미 있으면 dart pub get은 가능하다면 그 안에 잠긴 버전의 의존성을 사용해요. 잠기지 않은 의존성이 있으면, 모든 버전 제약을 만족하는 최신 버전을 가져와요. 이것이 dart pub get과, 항상 모든 의존성의 최신 버전을 가져오려는 dart pub upgrade의 주요 차이점이에요.

패키지 해석 (Package resolution)

기본적으로 pub은 .dart_tool/ 디렉터리에 패키지 이름을 위치 URI로 매핑하는 package_config.json 파일을 만들어요. 생성된 .dart_tool/ 디렉터리는 저장소에 커밋하지 마세요. 저장소의 .gitignore 파일에 추가해 주세요. 자세한 내용은 커밋하지 말아야 할 것 문서를 참고해요.

새 의존성 가져오기

pubspec에 의존성을 추가한 뒤 dart pub get을 실행하면, 새 의존성과 그 전이 의존성을 가져와요. 다만 새 의존성을 가져오는 데 꼭 필요하지 않다면 이미 가져온 의존성의 버전은 바꾸지 않아요.

의존성 제거하기

pubspec에서 의존성을 제거한 뒤 dart pub get을 실행하면, 그 의존성은 더 이상 import로 사용할 수 없게 돼요. 제거한 의존성의 전이 의존성도 남아있는 즉시 의존성 중 그들을 사용하는 게 없다면 함께 제거돼요. 의존성을 제거한다고 이미 가져온 다른 의존성의 버전이 바뀌지는 않아요.

시스템 패키지 캐시

Git이나 pub.dev 사이트처럼 인터넷을 통해 다운로드한 의존성은 시스템 전체 캐시에 저장돼요. 덕분에 여러 패키지가 같은 버전의 같은 의존성을 쓰더라도 한 번만 다운로드해서 로컬에 저장해 두면 돼요.

기본적으로 시스템 패키지 캐시는 macOS와 Linux에서는 홈 디렉터리의 .pub-cache 하위 폴더에 있고, Windows에서는 %LOCALAPPDATA%\Pub\Cache에 있어요 (Windows 버전에 따라 위치가 달라질 수 있어요). pub을 실행하기 전에 PUB_CACHE 환경 변수를 설정하면 캐시 위치를 직접 설정할 수 있어요.

오프라인에서 의존성 가져오기

네트워크에 접속하지 못해도 dart pub get을 실행할 수 있어요. pub은 패키지를 시스템의 모든 패키지가 공유하는 중앙 캐시에 다운로드하므로, 네트워크 없이도 이전에 다운로드한 패키지를 자주 찾아낼 수 있어요.

다만 기본적으로 호스팅된 의존성이 있으면 dart pub get은 온라인 상태로 시도해서 최신 버전의 의존성을 감지하려고 해요. 그렇게 하지 않으려면 --offline 플래그를 넘겨주세요. 오프라인 모드에서 pub은 로컬 패키지 캐시만 살펴보면서 이미 있는 것 중에 여러분의 패키지와 잘 맞는 버전 집합을 찾으려고 해요.

또한 pub은 lockfile을 생성한다는 점을 기억하세요. 캐시에 있는 어떤 의존성의 유일한 버전이 오래된 것이라면, 오프라인 dart pub get은 애플리케이션을 그 구버전으로 잠가버려요. 다음에 온라인 상태가 되면 dart pub upgrade를 실행해서 더 새로운 버전으로 올리는 게 좋아요.

옵션 (Options)

모든 pub 명령어에 적용되는 옵션은 글로벌 옵션 문서에서 확인할 수 있어요.

--[no-]offline

기본적으로 pub은 네트워크에 연결해서 호스팅된 패키지를 가져와요 (--no-offline). 대신 캐시된 패키지를 쓰려면 --offline을 사용해요. 자세한 내용은 오프라인에서 의존성 가져오는 방법을 참고해요.

--dry-run 또는 -n

바뀔 의존성을 알려주기만 하고 실제로는 변경하지 않아요. 변경하기 전에 업데이트 내용을 분석하고 싶을 때 유용해요.

--[no-]precompile

기본적으로 pub은 바로 아래 단계 의존성(immediate dependencies)에 있는 실행 파일을 미리 컴파일해요 (--precompile). 미리 컴파일을 막으려면 --no-precompile을 사용해요.

--[no-]example

기본적으로 pub은 패키지의 example/ 디렉터리에 있는 의존성도 함께 가져와요 (--example). example 의존성을 건너뛰려면 --no-example을 사용해요.

--enforce-lockfile

현재 pubspec.lock의 해석 내용을 강제해요. pubspec.lock이 pubspec.yaml의 유효한 해석 결과를 정확히 지정하지 않거나, 호스팅된 패키지의 내용 해시가 바뀌었다면 pub get을 오류 메시지와 함께 실패시켜요. CI나 프로덕션 배포에 유용해요. 프로덕션을 위한 의존성 가져오기 문서에서 자세한 내용을 읽어 보세요. 자세한 문제 해결 방법은 pub 문제 해결 가이드를 확인해 주세요.

더 알아보기