Skip to content

레지스트리에서 다운로드한 모든 패키지는 ~/.bun/install/cache 또는 환경 변수 BUN_INSTALL_CACHE_DIR 에 정의된 경로의 전역 캐시에 저장됩니다. 패키지는 ${name}@${version} 와 같은 하위 디렉토리에 저장되므로 패키지의 여러 버전을 캐시할 수 있습니다.

캐시 동작 구성

toml
[install.cache]
# 캐시에 사용할 디렉토리
dir = "~/.bun/install/cache"

# true 일 경우 전역 캐시에서 로드하지 않음.
# Bun 은 여전히 node_modules/.cache 에 쓸 수 있음.
disable = false

# true 일 경우 항상 레지스트리에서 최신 버전 해결
disableManifest = false

재다운로드 최소화

Bun 은 패키지를 여러 번 재다운로드하지 않도록 노력합니다. 패키지를 설치할 때 캐시에 이미 package.json 에 지정된 범위의 버전이 포함되어 있으면 Bun 은 패키지를 다시 다운로드하는 대신 캐시된 패키지를 사용합니다.

설치 세부 정보

semver 버전에 프리릴리스 접미사 (1.0.0-beta.0) 또는 빌드 접미사 (1.0.0+20220101) 가 있는 경우 긴 파일 경로와 관련된 오류 가능성을 줄이기 위해 해당 값의 해시로 대체됩니다.

node_modules 폴더가 있는 경우 설치 전에 Bun 은 node_modules 에 적절한 버전의 모든 예상 패키지가 포함되어 있는지 확인합니다. 그렇다면 bun install 이 완료됩니다. Bun 은 "name""version" 을 찾는 즉시 파싱을 중지하는 사용자 정의 JSON 파서를 사용합니다.

패키지가 누락되었거나 package.json 과 호환되지 않는 버전이 있는 경우 Bun 은 캐시에서 호환 가능한 모듈을 확인합니다. 있으면 node_modules 에 설치됩니다. 그렇지 않으면 패키지가 레지스트리에서 다운로드된 후 설치됩니다.


빠른 복사

패키지가 캐시에 다운로드되면 Bun 은 여전히 해당 파일을 node_modules 에 복사해야 합니다. Bun 은 이 작업을 수행하기 위해 사용 가능한 가장 빠른 syscalls 를 사용합니다. Linux 에서는 hardlinks 를 사용하고 macOS 에서는 clonefile 을 사용합니다.


디스크 공간 절약

Bun 은 Linux 와 Windows 에서 프로젝트의 node_modules 디렉토리에 모듈을 "복사"하기 위해 hardlinks 를 사용하므로 패키지의 내용은 디스크의 단일 위치에만 존재하여 node_modules 에 할당되는 디스크 공간의 양을 크게 줄입니다.

이 이점은 macOS 에도 적용되지만 예외가 있습니다. macOS 는 copy-on-write 인 clonefile 을 사용하여 디스크 공간을 차지하지 않지만 드라이브의 한도에 포함됩니다. 이 동작은 node_modules/* 를 패치하려는 시도가 있을 경우 유용하므로 다른 설치에 영향을 미칠 수 없습니다.

설치 전략

이 동작은 Bun 의 모든 패키지 관리 명령에서 적용되는 --backend 플래그로 구성할 수 있습니다.

  • hardlink: Linux 와 Windows 에서 기본값.
  • clonefile: macOS 에서 기본값.
  • clonefile_each_dir: clonefile 과 유사하지만 디렉토리별로 각 파일을 개별적으로 복제합니다. macOS 에서만 사용 가능하며 일반적으로 clonefile 보다 느립니다.
  • copyfile: 위 항목 중 하나가 실패할 때 사용되는 폴백. 가장 느린 옵션입니다. macOS 에서는 fcopyfile() 을 사용하고 Linux 에서는 copy_file_range() 를 사용합니다.
  • symlink: 현재 file: (그리고 궁극적으로 link:) 의존성에서만 사용됩니다. 무한 루프를 방지하기 위해 node_modules 폴더의 심볼릭 링크를 생성하지 않습니다.

--backend=symlink 로 설치하면 Node.js 는 각 의존성에 자체 node_modules 폴더가 있거나 --preserve-symlinksnode 에 전달하지 않는 한 의존성의 node_modules 를 해결하지 않습니다. --preserve-symlinks 에 대한 Node.js 문서 를 참조하세요.

bash
bun install --backend symlink
node --preserve-symlinks ./foo.js

Bun 런타임은 현재 --preserve-symlinks 와 동등한 기능을 제공하지 않습니다.

Bun by www.bunjs.com.cn 편집