TechFeedTechFeed
Programming Languages

ETARGET, 맞는 버전 없음, 레지스트리 | 그 버전이 목록에 없으면?

ETARGET는 레지스트리 메타는 있는데 요청한 버전이나 범위, dist-tag의 배포가 없을 때 npm이 내는 코드입니다. npm view로 그 레지스트리의 목록을 보고 범위를 있는 번호로 바꿉니다. 피어 충돌, 해시 불일치, 얼린 락 거절과 줄을 가릅니다. npm, 스코프, CI, 한국 1인 개발. 2026년 9월 npm 문서.

by

ETARGET는 레지스트리에서 패키지 메타는 받았는데, 요청한 버전이나 범위, dist-tag에 맞는 배포가 없을 때 npm이 내는 코드입니다. 줄은 notarget No matching version found for 이름@범위입니다.


피어가 충돌한 ERESOLVE, 받은 파일 해시가 락과 다른 EINTEGRITY, 락이 package.json보다 낡은 얼린 설치 거절과 자리가 다릅니다. 캐시를 지우고 락을 버려도, 그 레지스트리에 없는 버전은 생기지 않습니다.


npm view로 그 레지스트리의 버전 목록을 먼저 보고, package.json의 범위를 있는 번호로 바꾸세요. 스코프 패키지라면 .npmrc가 공개 레지스트리를 가리키는지도 같이 봅니다. 명령 설명은 npm view 문서에 있습니다.


notarget 줄이 가리키는 칸

오류 안의 이름@범위가 요청입니다. vue@^2.8.0처럼 범위일 수도 있고, axios@1.2.3처럼 정확한 번호일 수도 있습니다.


npm은 그 레지스트리의 메타에서 그 범위에 들어가는 버전을 찾다 0건이면 ETARGET로 멈춥니다. 메시지에 부모 패키지 이름이 있으면, 직접 의존이 아니라 그 패키지가 요구한 범위입니다. package.json만 고치면 다음 설치에서 또 같은 부모가 같은 범위를 부릅니다.


이름 자체가 레지스트리에 없으면 보통 404입니다. ETARGET는 메타는 있는데 버전 칸이 비는 경우로 두세요. 두 코드를 한 수정으로 섞으면 철자 오류를 범위 오류로 고치게 됩니다.


고치기 전에 남길 한 줄 | npm config get registry 결과와 notarget의 이름@범위를 같이 적습니다. 목록 조회는 그 레지스트리 기준이어야 합니다.


모니터 뒤를 본 작업 책상. npm이 없는 버전을 거절할 때 확인하는 자리
없는 버전은 락을 지워도 생기지 않는다. 목록을 먼저 본다

설치가 멈추는 다른 코드와 가르기

설치 로그의 첫 코드만 보고 순서를 고르면 됩니다.


코드의미맞는 다음 동작
ETARGET그 범위의 배포가 그 레지스트리에 없음npm view로 목록 확인
404패키지 이름이 없거나 권한이 없음철자, 스코프, 토큰
ERESOLVE버전은 있는데 피어가 충돌overrides, 피어 범위
EINTEGRITY받은 파일 해시가 락과 다름캐시 또는 락 해시
EAI_AGAIN레지스트리 이름이 잠깐 안 풀림리졸버
OUTDATED_LOCKFILEpackage.json만 바뀌고 락이 옛것락을 갱신해 커밋

--legacy-peer-deps는 ERESOLVE용입니다. ETARGET에는 맞는 배포를 만들어 주지 않습니다. --force도 없는 버전을 공개 레지스트리에 올리지 않습니다. 피어 충돌은 ERESOLVE 글, 해시는 EINTEGRITY 글, 피엔피엠 얼린 락은 outdated lockfile 글을 보세요.


npm view로 있는 번호만 고르기

웹 사이트의 버전과 지금 레지스트리의 버전이 다를 수 있습니다. 설치가 보는 쪽은 npm view입니다.


그 레지스트리에 있는 버전과 태그
npm config get registry npm view vue versions --json npm view vue dist-tags --json npm view vue@3.5.0 version

세 번째 명령이 번호를 출력하면 그 정확한 버전은 있습니다. 범위만 0건인 경우입니다. versions가 빈 배열이거나 404면 이름과 레지스트리부터 다시 봅니다.


캐럿 ^1.2.3은 1.2.3 이상, 2.0.0 미만입니다. 1.x 최신이 1.2.2이면 ^1.2.3은 0건이라 ETARGET가 납니다. 틸드 ~1.2.3은 1.2.3 이상, 1.3.0 미만입니다. 패치가 없으면 역시 0건입니다. dist-tag latest나 next를 요청했는데 그 태그가 없으면 같은 코드입니다. 태그 목록은 dist-tags로 확인합니다.


  • [ ] notarget의 이름@범위를 그대로 복사했다
  • [ ] 같은 레지스트리에서 versions를 봤다
  • [ ] 정확한 번호가 있는지 view 이름@번호로 확인했다
  • [ ] 캐럿과 틸드가 0건인 범위를 가리키는지 계산했다

광케이블 패치 패널. 사설 레지스트리와 공개 레지스트리 주소를 구분하는 장면
웹에 있는 번호와 npm view에 있는 번호가 다를 수 있다

스코프가 다른 레지스트리를 볼 때

@myorg/ui@1.4.0이 깃허브 패키지에만 있고 .npmrc에 스코프 줄이 없으면, npm은 공개 레지스트리에서 그 버전을 찾다 ETARGET나 404를 냅니다.


스코프 한 줄과 인증 호스트가 짝입니다. 토큰은 저장소에 커밋하지 말고 환경 변수로 두세요. 로그에 토큰이 찍혔으면 그 토큰을 폐기합니다. 공개 패키지를 사내 레지스트리로만 보게 만든 줄도 반대 방향의 ETARGET를 만듭니다. npm config get @myorg:registry로 확인하세요.


스코프만 사설 레지스트리로
@myorg:registry=https://npm.pkg.github.com //npm.pkg.github.com/:_authToken=${NPM_TOKEN}

액션에서는 그 환경 변수가 잡에 들어 있는지 먼저 봅니다. 로컬 ~/.npmrc에만 토큰이 있으면 노트북 설치는 되고 액션만 ETARGET입니다. 락을 지우는 순서는 토큰이 맞는 다음입니다.


캐시를 비우는 시점

npmjs.com과 npm view가 둘 다 그 번호를 모르면 캐시 문제가 아닙니다. package.json이나 부모 패키지의 범위를 있는 번호로 바꿉니다. 락을 삭제해도 없는 버전은 설치되지 않고, 있는 다른 버전으로 락이 다시 써질 뿐입니다. 그 차이는 리뷰할 디프가 커집니다.


사이트에는 있는데 npm view에만 없으면 그때 캐시입니다. npm cache clean --force 뒤에 같은 view를 다시 실행하세요. view가 번호를 보여 준 다음에만 설치를 반복합니다.


view 결과의미다음
목록에 번호가 없음그 레지스트리에 배포가 없음범위 또는 레지스트리 주소
정확한 번호는 있고 범위는 실패캐럿, 틸드, 태그가 0건범위를 있는 번호로
웹에만 있고 view에는 없음다른 레지스트리 또는 오래된 메타registry 확인 후 캐시
로컬만 되고 CI만 실패잡의 .npmrc, 토큰스코프 줄과 시크릿

한국에서 혼자 공개 패키지와 깃허브 패키지를 한 저장소에 두면, 노트북 ~/.npmrc만 맞고 액션 시크릿이 비어 프리뷰 설치가 ETARGET로 죽습니다. 모듈을 못 찾는 런타임 오류는 설치가 끝난 다음이라 Cannot find module 글의 자리입니다.


서버실 통로. 설치 실패 코드를 버전 없음과 해시 실패로 나누는 장면
view가 번호를 보여 준 뒤에만 캐시와 설치를 반복한다

참고 자료


내부 연계: ERESOLVE, EINTEGRITY, 얼린 락, EAI_AGAIN.


범위 문법과 view 동작은 2026년 9월 29일 npm 문서 기준입니다.


자주 묻는 질문

락을 지웠는데도 ETARGET입니다.

락은 이미 있는 배포의 해시 목록입니다. 레지스트리에 그 범위가 0건이면 락을 만들어도 설치가 같은 코드로 멈춥니다. view 목록에 있는 번호로 범위를 바꾸세요.


legacy-peer-deps를 켜면 지나가나요?

그 플래그는 피어 충돌인 ERESOLVE용입니다. 맞는 버전이 0건인 ETARGET에는 배포를 추가하지 않습니다. 코드가 ERESOLVE로 바뀐 뒤에 피어 글을 보세요.


웹에는 1.4.0이 있는데 view에는 없습니다.

설치는 npm config get registry가 가리키는 곳을 봅니다. 스코프 레지스트리인지, 메타 캐시가 옛것인지 나눈 뒤 캐시를 비우고 view를 다시 실행하세요.


캐럿을 붙였더니 바로 실패합니다.

캐럿은 그 번호 이상, 다음 메이저 미만입니다. 게시된 최신이 그 번호보다 낮으면 0건입니다. 있는 최신으로 내리거나, 아직 없는 미래 번호를 요구하지 않으면 됩니다.


로컬은 되고 액션만 ETARGET입니다.

잡의 레지스트리와 토큰이 노트북과 다릅니다. 스코프 줄과 시크릿을 워크플로에 두고, 토큰 값은 로그에 찍지 마세요.


부모 패키지 이름이 같이 찍힙니다.

직접 의존이 아니라 그 부모가 요구한 범위입니다. 부모 버전을 올리거나, 그 범위가 가리키는 패키지를 overrides로 있는 번호에 고정하세요. 없는 번호를 overrides에 적어도 ETARGET는 남습니다.


ETARGET는 그 레지스트리에 그 범위의 배포가 없는 설치 실패입니다. view로 목록을 보고 범위를 고치세요. 피어 충돌, 해시, 얼린 락, 이름 해석 실패는 다른 코드입니다. 관련 글: ERESOLVE, EINTEGRITY, EAI_AGAIN.


부모 묶음 이름이 오류에 같이 있으면 루트 목록만 고쳐서는 다음 설치가 같은 범위를 다시 부릅니다. 그 부모를 올리거나, 이미 있는 번호로 고정하세요. 없는 번호를 고정란에 적어도 배포는 생기지 않습니다. 인증 값은 환경으로만 넘기고 저장소에 적지 마세요. 노트북 설정에만 그 값이 있으면 개인 컴퓨터는 설치되고 원격 작업만 실패합니다. 웹 페이지의 버전 표와 명령이 보여주는 목록이 다르면, 명령이 보는 주소를 먼저 맞춘 뒤에 받아 둔 메타를 비웁니다. 작은 판을 허용하는 범위는 그 번호 이상 다음 큰 판 미만이라, 게시된 최신이 더 낮으면 맞는 배포가 영 건입니다. 정확한 번호가 목록에 있고 범위만 실패하면 잠금 파일을 지우기 전에 범위를 그 번호로 바꾸세요. 목록에 없는 번호를 맞추려고 잠금 파일을 지우는 일이 반복되면, 리뷰할 차이가 커지고 원인 줄은 그대로입니다. 있는 번호를 고른 뒤 한 번만 설치해 잠금 파일을 다시 만들면 원격 작업과 노트북이 같은 배포를 보게 됩니다. 원격 저장소의 설치 로그에 부모 이름이 있으면, 개인 목록의 철자부터 의심하지 말고 그 부모가 요구한 범위를 있는 번호와 나란히 적으세요. 그 한 줄이 남으면 잠금 파일을 지우는 순서는 뒤로 밀립니다. 있는 번호로 바꾼 커밋만 원격에 올리면, 얼린 설치가 그 다음부터 같은 이유로 멈추지 않습니다.


ETARGETnpm버전레지스트리dist-tag스코프설치개발자

함께 보면 좋은 문제 해결

EXPLORE / Programming Languages

이어서 읽어보기

전체 토픽 둘러보기 →