pub 문제 해결(Troubleshooting)

pub 문제 해결(Troubleshooting)

pub를 쓰다 보면 다양한 오류를 만나게 돼요. 이 페이지에서는 패키지 게시나 의존성 설치 중에 흔히 마주치는 문제와 해결 방법을 상황별로 정리해 드릴게요.

출처: Troubleshooting pub

본문

패키지 게시 시 "403" 오류 발생

pub publish를 실행할 때 다음과 같은 오류를 받게 되는 경우가 있어요.

HTTP error 403: Forbidden
...
You aren't an uploader for package '<foo>'

이 문제는 계정 중 하나가 패키지 게시 권한을 부여받았는데, pub 클라이언트가 다른 계정으로 사용자를 등록했을 때 생길 수 있어요. pub 자격 증명 파일을 삭제해서 pub의 인증 과정을 초기화하면 해결돼요.

Linux

$XDG_CONFIG_HOME이 정의돼 있다면:

$ rm $XDG_CONFIG_HOME/dart/pub-credentials.json

그렇지 않다면:

$ rm $HOME/.config/dart/pub-credentials.json

macOS

$ rm $HOME/Library/Application Support/dart/pub-credentials.json

Windows

명령 프롬프트(Command Prompt)를 사용한다면:

$ del "%APPDATA%\dart\pub-credentials.json"

PowerShell을 사용한다면:

$ Remove-Item -Path "%APPDATA%\dart\pub-credentials.json"

버전 참고: Dart 2.14 이하에서는 PUB_CACHE 폴더에 있는 credentials.json 파일을 삭제해야 해요.

패키지 게시 시 "UnauthorizedAccess" 오류 발생

pub publish를 실행할 때 다음과 같은 오류를 받게 돼요.

UnauthorizedAccess: Unauthorized user: <username> is not allowed to upload versions to package '<foo>'.

이 메시지는 패키지의 새 버전을 게시할 권한이 있는 사람 목록에 자신이 없을 때 표시돼요. Uploaders를 참고하세요.

pub build가 HttpException 오류로 실패하는 경우

pub build를 실행할 때 다음과 비슷한 HttpException 오류가 발생할 수 있어요.

Pub build failed, [1] IsolateSpawnException: 'HttpException: Connection closed while receiving data,
...
library handler failed
...

이 오류는 AVG 2013 Internet security suite 같은 일부 안티바이러스 소프트웨어 때문에 생길 수 있어요. 보안 스위트의 매뉴얼을 확인해서 이 기능을 어떻게 임시로 끄는지 알아보세요. 예를 들면 How to Disable AVG Components를 참고할 수 있어요.

회사 방화벽 뒤에서 pub get이 실패하는 경우

커맨드라인에서 pub는 http_proxyhttps_proxy 환경 변수를 존중해요. 프록시 서버 환경 변수는 다음과 같이 설정하면 돼요.

Linux/macOS:

$ export https_proxy=hostname:port

Windows 명령 프롬프트:

$ set https_proxy=hostname:port

Windows PowerShell:

$ $Env:https_proxy="hostname:port"

프록시가 자격 증명을 요구한다면 다음과 같이 설정하면 돼요.

Linux/macOS:

$ export https_proxy=username:password@hostname:port

Windows 명령 프롬프트:

$ set https_proxy=username:password@hostname:port

Windows PowerShell:

$ $Env:https_proxy="username:password@hostname:port"

로그인 후 localhost에 접근할 수 없는 경우

컨테이너나 SSH 세션에서 dart pub publish를 실행하면, dart pub가 듣고 있는 localhost가 브라우저에서 접근할 수 있는 localhost와 다를 수 있어요. 브라우저로 로그인은 되지만, 브라우저가 http://localhost:<port>?code=...를 접근할 수 없다고 불평하게 되죠.

로그인을 커맨드라인으로 완료하는 다음 우회 방법을 시도해 보세요.

  1. 터미널 창에서 dart pub publish를 실행해요.
  2. 열리는 브라우저 창에서 로그인해요. 브라우저가 새 localhost URL(http://localhost:<port>?code=...)로 리디렉션되지만 그 URL에 접근할 수 없다고 불평할 거예요.
  3. 브라우저에서 새 localhost URL을 복사해요.
  4. dart pub publish를 호출한 것과 같은 컨테이너나 호스트의 다른 터미널 창에서 curl 명령으로 새 localhost URL을 사용해 로그인을 완료해요.
$ curl 'http://localhost:<port>?code=...'

패키지를 찾으려다 소켓 오류가 발생하는 경우

다음 오류는 인터넷에 접속할 수 없거나, ISP가 pub.dev를 차단했거나, 보안 소프트웨어가 dart의 인터넷 접속을 차단할 때 발생할 수 있어요.

Got socket error trying to find package ... at https://pub.dev.
pub get failed (server unavailable) -- attempting retry 1 in 1 second...

인터넷 연결 상태를 확인하고, dart의 인터넷 접속을 차단하는 방화벽이나 다른 보안 소프트웨어가 없는지 확인해 보세요.

Kaspersky Internet Security에 대한 자세한 안내

Kaspersky Internet Security 보호 기능을 메뉴 바에서 꺼도 VPN 애플리케이션 필터 sysextctrld는 여전히 백그라운드에서 실행돼요. 이 필터가 pub.dev에 연결하지 못하게 만들어요. 이 문제를 해결하려면 https://pub.devhttps://pub.dartlang.org 둘 다 신뢰 구역(trusted zone)에 추가하면 돼요.

  1. Kaspersky Internet Security를 엽니다.
  2. Privacy 아이콘을 클릭합니다.
  3. Block website tracking 섹션에서 Preferences 버튼을 클릭합니다.
  4. 상단 아이콘 바에서 Threats를 선택합니다.
  5. Threats 아래에서 Trusted Zone을 클릭합니다.
  6. Trusted web addresses 탭을 선택합니다.
  7. + 버튼을 클릭하고 URL https://pub.dev를 추가합니다.
  8. OK를 클릭합니다.
  9. https://pub.dartlang.org에 대해 이전 두 단계를 반복합니다.

더 알아보기