InfoGrab DocsInfoGrab Docs

Yarn으로 패키지 게시

요약

Yarn 1 (Classic) 및 Yarn 2+로 패키지를 게시하고 설치할 수 있습니다. 배포 컨테이너에서 사용하는 Yarn 버전을 확인하려면 yarn publish를 호출하는 CI/CD 스크립트 job 블록의 script 블록에서 yarn --version을 실행합니다.

Yarn 1 (Classic) 및 Yarn 2+로 패키지를 게시하고 설치할 수 있습니다.

배포 컨테이너에서 사용하는 Yarn 버전을 확인하려면 yarn publish를 호출하는 CI/CD 스크립트 job 블록의 script 블록에서 yarn --version을 실행합니다. Yarn 버전은 파이프라인 출력에 표시됩니다.

패키지 레지스트리 인증#

패키지 레지스트리와 상호 작용하려면 토큰이 필요합니다. 목적에 따라 사용할 수 있는 토큰이 다릅니다. 자세한 내용은 토큰 안내를 참고합니다.

  • 조직에서 이중 인증(2FA)을 사용한다면 범위를 api로 설정한 개인 액세스 토큰을 사용해야 합니다.
  • CI/CD 파이프라인으로 패키지를 게시한다면 개인 러너와 함께 CI/CD job 토큰을 사용할 수 있습니다. 인스턴스 러너에는 변수를 등록할 수도 있습니다.

게시를 위한 Yarn 구성#

패키지 레지스트리에 게시하도록 Yarn을 구성하려면 .yarnrc.yml 파일을 편집합니다. 이 파일은 package.json 파일과 같은 위치인 프로젝트 루트 디렉터리에 있습니다.

  • .yarnrc.yml을 편집해 다음 구성을 추가합니다.

    npmScopes:
      <my-org>:
        npmPublishRegistry: 'https://<domain>/api/v4/projects/<project_id>/packages/npm/'
        npmAlwaysAuth: true
        npmAuthToken: '<token>'
    

    이 구성에서 각 값은 다음과 같이 바꿉니다.

    • <my-org>는 조직 범위로 바꿉니다. @ 기호는 포함하지 않습니다.
    • <domain>은 도메인 이름으로 바꿉니다.
    • <project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
    • <token>은 배포 토큰, 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.

Yarn Classic에서는 publishConfig["@scope:registry"]로 범위를 지정한 레지스트리를 지원하지 않습니다. 자세한 내용은 Yarn pull request 7829를 참고합니다. 대신 package.json 파일에서 publishConfig를 registry로 설정합니다.

패키지 게시#

명령줄에서 또는 GitLab CI/CD로 패키지를 게시할 수 있습니다.

명령줄 사용#

패키지를 수동으로 게시하는 방법은 다음과 같습니다.

  • 다음 명령을 실행합니다.

    # Yarn 1 (Classic)
    yarn publish
    
    # Yarn 2+
    yarn npm publish
    

CI/CD 사용#

인스턴스 러너(기본) 또는 개인 러너(고급)로 패키지를 자동으로 게시할 수 있습니다. CI/CD로 게시할 때는 파이프라인 변수를 사용할 수 있습니다.

  1. 프로젝트 또는 그룹의 인증 토큰을 만듭니다.

    1. 상단 표시줄에서 Search or go to를 선택하고 프로젝트 또는 그룹을 찾습니다.
    2. 왼쪽 사이드바에서 Settings > Repository > Deploy Tokens를 선택합니다.
    3. read_package_registry 및 write_package_registry 범위를 가진 배포 토큰을 만들고 생성된 토큰을 복사합니다.
    4. 왼쪽 사이드바에서 Settings > CI/CD > Variables를 선택합니다.
    5. Add variable을 선택하고 다음 설정을 사용합니다.
    필드 값
    key NPM_AUTH_TOKEN
    value
    type Variable
    Protected variable CHECKED
    Mask variable CHECKED
    Expand variable CHECKED
  2. 선택 사항. 보호된 변수를 사용하려면 다음을 진행합니다.

    1. Yarn 패키지 소스 코드가 있는 리포지터리로 이동합니다.
    2. 왼쪽 사이드바에서 Settings > Repository를 선택합니다.
      • 태그가 있는 브랜치에서 빌드한다면 Protected Tags를 선택하고 시맨틱 버전 관리를 위해 v*(와일드카드)를 추가합니다.
      • 태그가 없는 브랜치에서 빌드한다면 Branch rules를 선택합니다.
  3. package.json 이 있는 패키지 프로젝트 루트 디렉터리의 .yarnrc.yml 구성에 앞에서 만든 NPM_AUTH_TOKEN을 추가합니다.

    npmScopes:
      <my-org>:
        npmPublishRegistry: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/'
        npmAlwaysAuth: true
        npmAuthToken: '${NPM_AUTH_TOKEN}'
    

    이 구성에서 <my-org>는 @ 기호를 제외한 조직 범위로 바꿉니다.

  1. package.json 이 있는 패키지 프로젝트 루트 디렉터리의 .yarnrc.yml 구성에 CI_JOB_TOKEN을 추가합니다.

    npmScopes:
      <my-org>:
        npmPublishRegistry: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/'
        npmAlwaysAuth: true
        npmAuthToken: '${CI_JOB_TOKEN}'
    

    이 구성에서 <my-org>는 @ 기호를 제외한 조직 범위로 바꿉니다.

  2. .yarnrc.yml 이 있는 GitLab 프로젝트에서 .gitlab-ci.yml 파일을 편집하거나 새로 만듭니다. 예를 들어 태그 푸시에서만 트리거하려면 다음과 같이 작성합니다.

    Yarn 1의 경우:

    image: node:lts
    
    stages:
      - deploy
    
    rules:
    - if: $CI_COMMIT_TAG
    
    deploy:
      stage: deploy
      script:
        - yarn publish
    

    Yarn 2 이상의 경우:

    image: node:lts
    
    stages:
      - deploy
    
    rules:
      - if: $CI_COMMIT_TAG
    
    deploy:
      stage: deploy
      before_script:
        - corepack enable
        - yarn set version stable
      script:
        - yarn npm publish
    

파이프라인이 실행되면 패키지가 패키지 레지스트리에 추가됩니다.

패키지 설치#

인스턴스 또는 프로젝트에서 설치할 수 있습니다. 이름과 버전이 같은 패키지가 여러 개 있으면 패키지를 설치할 때 가장 최근에 게시된 패키지만 가져옵니다.

범위가 지정된 패키지 이름#

인스턴스에서 설치하려면 패키지 이름에 범위가 지정되어 있어야 합니다. 패키지 범위는 .yarnrc.yml 파일과 package.json의 publishConfig 옵션에서 설정할 수 있습니다. 프로젝트나 그룹에서 설치한다면 패키지 이름 규칙을 따르지 않아도 됩니다.

패키지 범위는 @로 시작하며 @owner/package-name 형식을 따릅니다.

  • @owner는 패키지 소스 코드가 있는 프로젝트의 루트가 아니라 패키지를 호스팅하는 최상위 프로젝트입니다.
  • 패키지 이름은 무엇이든 가능합니다.

예를 들면 다음과 같습니다.

프로젝트 URL 패키지 레지스트리 조직 범위 전체 패키지 이름
https://gitlab.com/<my-org>/<group-name>/<package-name-example> Package Name Example @my-org @my-org/package-name
https://gitlab.com/<example-org>/<group-name>/<project-name> Project Name @example-org @example-org/project-name

인스턴스에서 설치#

같은 조직 범위에서 여러 패키지를 다룬다면 인스턴스에서 설치하는 방안을 고려합니다.

  1. 조직 범위를 구성합니다. .yarnrc.yml 파일에 다음을 추가합니다.

    npmScopes:
     <my-org>:
       npmRegistryServer: 'https://<domain_name>/api/v4/packages/npm'
    
    • <my-org>는 패키지를 설치할 프로젝트의 루트 수준 그룹으로 바꾸고 @ 기호는 제외합니다.
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
  2. 선택 사항. 패키지가 비공개라면 패키지 레지스트리 액세스를 구성해야 합니다.

    npmRegistries:
      //<domain_name>/api/v4/packages/npm:
        npmAlwaysAuth: true
        npmAuthToken: '<token>'
    
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
  3. Yarn으로 패키지를 설치합니다.

그룹 또는 프로젝트에서 설치#

일회성 패키지라면 그룹이나 프로젝트에서 설치할 수 있습니다.

  1. 그룹 범위를 구성합니다. .yarnrc.yml 파일에 다음을 추가합니다.

    npmScopes:
      <my-org>:
        npmRegistryServer: 'https://<domain_name>/api/v4/groups/<group_id>/-/packages/npm'
    
    • <my-org>는 설치하려는 그룹을 포함하는 최상위 그룹으로 바꿉니다. @ 기호는 제외합니다.
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <group_id>는 그룹 개요 페이지에서 확인할 수 있는 그룹 ID로 바꿉니다.
  2. 선택 사항. 패키지가 비공개라면 레지스트리를 설정해야 합니다.

    npmRegistries:
      //<domain_name>/api/v4/groups/<group_id>/-/packages/npm:
        npmAlwaysAuth: true
        npmAuthToken: "<token>"
    
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
    • <group_id>는 그룹 개요 페이지에서 확인할 수 있는 그룹 ID로 바꿉니다.
  3. Yarn으로 패키지를 설치합니다.

  1. 프로젝트 범위를 구성합니다. .yarnrc.yml 파일에 다음을 추가합니다.

    npmScopes:
     <my-org>:
       npmRegistryServer: "https://<domain_name>/api/v4/projects/<project_id>/packages/npm"
    
    • <my-org>는 설치하려는 프로젝트를 포함하는 최상위 그룹으로 바꿉니다. @ 기호는 제외합니다.
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
  2. 선택 사항. 패키지가 비공개라면 레지스트리를 설정해야 합니다.

    npmRegistries:
      //<domain_name>/api/v4/projects/<project_id>/packages/npm:
        npmAlwaysAuth: true
        npmAuthToken: "<token>"
    
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
    • <project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
  3. Yarn으로 패키지를 설치합니다.

Yarn으로 설치#

  • 명령줄이나 CI/CD 파이프라인에서 yarn add를 실행합니다.
yarn add @scope/my-package

Yarn Classic에는 .npmrc 파일과 .yarnrc 파일이 모두 필요합니다. 자세한 내용은 Yarn issue 4451을 참고합니다.

  1. 자격 증명은 .npmrc 파일에, 범위가 지정된 레지스트리는 .yarnrc 파일에 넣습니다.

    # .npmrc
    ## For the instance
    //<domain_name>/api/v4/packages/npm/:_authToken='<token>'
    ## For the group
    //<domain_name>/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
    ## For the project
    //<domain_name>/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'
    
    # .yarnrc
    ## For the instance
    '@scope:registry' 'https://<domain_name>/api/v4/packages/npm/'
    ## For the group
    '@scope:registry' 'https://<domain_name>/api/v4/groups/<group_id>/-/packages/npm/'
    ## For the project
    '@scope:registry' 'https://<domain_name>/api/v4/projects/<project_id>/packages/npm/'
    
  2. 명령줄이나 CI/CD 파이프라인에서 yarn add를 실행합니다.

    yarn add @scope/my-package
    

Yarn 패키지 삭제#

사전 요구 사항:

  • Maintainer 또는 Owner 권한이 있어야 합니다.

패키지를 삭제하기 전에 관련 보안 위험을 파악해야 합니다.

패키지를 삭제하는 방법은 다음 두 가지입니다.

관련 주제#

문제 해결#

npm 레지스트리의 패키지 레지스트리에서 Yarn 실행 오류#

Yarn을 npm 레지스트리와 함께 사용하면 다음과 같은 오류 메시지가 나타날 수 있습니다.

yarn install v1.15.2
warning package.json: No license field
info No lockfile found.
warning XXX: No license field
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error An unexpected error occurred: "https://gitlab.example.com/api/v4/projects/XXX/packages/npm/XXX/XXX/-/XXX/XXX-X.X.X.tgz: Request failed \"404 Not Found\"".
info If you think this is a bug, please open a bug report with the information provided in "/Users/XXX/gitlab-migration/module-util/yarn-error.log".
info Visit https://classic.yarnpkg.com/en/docs/cli/install for documentation about this command

이 경우 다음 명령은 현재 디렉터리에 .yarnrc라는 파일을 만듭니다. 전역 구성이라면 사용자 홈 디렉터리에서, 프로젝트별 구성이라면 프로젝트 루트에서 실행해야 합니다.

yarn config set '//gitlab.example.com/api/v4/projects/<project_id>/packages/npm/:_authToken' '<token>'
yarn config set '//gitlab.example.com/api/v4/packages/npm/:_authToken' '<token>'

그룹 설치에서 tarball을 가져올 때 Yarn Classic 이 404 Not Found를 반환#

Yarn Classic으로 그룹의 레지스트리에서 패키지를 설치하면 패키지 확인은 성공하지만 tarball 다운로드가 404 Not Found 오류로 실패할 수 있습니다.

[1/4] Resolving packages...
[2/4] Fetching packages...
error Error: https://gitlab.example.com/api/v4/projects/<project_id>/packages/npm/@scope/my-package/-/@scope/my-package-1.0.0.tgz: Request failed "404 Not Found"

이 오류는 그룹 레지스트리가 반환하는 패키지 메타데이터에 프로젝트 엔드포인트를 가리키는 tarball 다운로드 URL 이 들어 있기 때문에 발생합니다. .npmrc 파일에 그룹 엔드포인트의 인증 토큰만 있으면 프로젝트 엔드포인트로 보내는 요청은 인증되지 않은 상태가 되어 404를 반환합니다.

이 문제를 해결하려면 .npmrc 파일에 그룹 엔드포인트와 프로젝트 엔드포인트의 인증 토큰을 모두 추가합니다.

# .npmrc
//gitlab.example.com/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
//gitlab.example.com/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'

단축된 인증 경로에서 Yarn Classic 이 401 Unauthorized를 반환#

Yarn Classic을 GitLab 패키지 레지스트리와 함께 사용할 때 인증 토큰이 유효한데도 401 Unauthorized 오류가 발생할 수 있습니다. 오류 메시지는 다음과 같은 형태입니다.

error Couldn't find package "@scope/my-package" on the "npm" registry.

--verbose 플래그를 사용하면 로그에 401 상태 코드가 표시됩니다.

verbose Performing "GET" request to "https://gitlab.com/api/v4/groups/<group_id>/-/packages/npm/..."
verbose Request "https://gitlab.com/api/v4/groups/<group_id>/-/packages/npm/..." finished with status code 401.

이 문제는 .npmrc의 _authToken 항목이 전체 엔드포인트 경로가 아니라 단축된 상위 경로를 사용할 때 발생합니다. 예를 들면 다음과 같습니다.

# Does NOT work with Yarn Classic
//gitlab.com/api/v4/:_authToken='<token>'

npm 8 이상은 계층적 인증 매칭(상위 경로에 설정한 토큰이 모든 하위 경로에 적용되는 방식)을 지원하지만, Yarn Classic은 _authToken 항목과 레지스트리 URL의 경로가 정확히 일치해야 합니다.

이 문제를 해결하려면 .npmrc 파일에서 인증하는 레지스트리마다 전체 엔드포인트 경로를 사용합니다. 예를 들어 패키지가 특정 프로젝트에 호스팅된 그룹 레지스트리에서 설치하는 경우는 다음과 같습니다.

# .npmrc
//gitlab.com/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
//gitlab.com/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'

그룹 엔드포인트가 반환하는 패키지 메타데이터에 프로젝트 엔드포인트를 가리키는 tarball 다운로드 URL 이 들어 있으므로 프로젝트 항목이 필요합니다.

yarn install 이 의존성으로 리포지터리를 클론하는 데 실패#

Dockerfile에서 yarn install을 사용하면 Dockerfile을 빌드할 때 다음과 같은 오류가 발생할 수 있습니다.

...
#6 8.621 fatal: unable to access 'https://gitlab.com/path/to/project/': Problem with the SSL CA cert (path? access rights?)
#6 8.621 info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
#6 ...

이 문제를 해결하려면 .dockerignore 파일의 Yarn 관련 경로마다 느낌표(!)를 추가합니다.

**

!./package.json
!./yarn.lock
...

Yarn으로 패키지 게시

GitLab v19.5
원문 보기

요약

Yarn 1 (Classic) 및 Yarn 2+로 패키지를 게시하고 설치할 수 있습니다. 배포 컨테이너에서 사용하는 Yarn 버전을 확인하려면 yarn publish를 호출하는 CI/CD 스크립트 job 블록의 script 블록에서 yarn --version을 실행합니다.

Yarn 1 (Classic) 및 Yarn 2+로 패키지를 게시하고 설치할 수 있습니다.

배포 컨테이너에서 사용하는 Yarn 버전을 확인하려면 yarn publish를 호출하는 CI/CD 스크립트 job 블록의 script 블록에서 yarn --version을 실행합니다. Yarn 버전은 파이프라인 출력에 표시됩니다.

패키지 레지스트리 인증#

패키지 레지스트리와 상호 작용하려면 토큰이 필요합니다. 목적에 따라 사용할 수 있는 토큰이 다릅니다. 자세한 내용은 토큰 안내를 참고합니다.

  • 조직에서 이중 인증(2FA)을 사용한다면 범위를 api로 설정한 개인 액세스 토큰을 사용해야 합니다.
  • CI/CD 파이프라인으로 패키지를 게시한다면 개인 러너와 함께 CI/CD job 토큰을 사용할 수 있습니다. 인스턴스 러너에는 변수를 등록할 수도 있습니다.

게시를 위한 Yarn 구성#

패키지 레지스트리에 게시하도록 Yarn을 구성하려면 .yarnrc.yml 파일을 편집합니다. 이 파일은 package.json 파일과 같은 위치인 프로젝트 루트 디렉터리에 있습니다.

  • .yarnrc.yml을 편집해 다음 구성을 추가합니다.

    npmScopes:
      <my-org>:
        npmPublishRegistry: 'https://<domain>/api/v4/projects/<project_id>/packages/npm/'
        npmAlwaysAuth: true
        npmAuthToken: '<token>'
    

    이 구성에서 각 값은 다음과 같이 바꿉니다.

    • <my-org>는 조직 범위로 바꿉니다. @ 기호는 포함하지 않습니다.
    • <domain>은 도메인 이름으로 바꿉니다.
    • <project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
    • <token>은 배포 토큰, 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.

Yarn Classic에서는 publishConfig["@scope:registry"]로 범위를 지정한 레지스트리를 지원하지 않습니다. 자세한 내용은 Yarn pull request 7829를 참고합니다. 대신 package.json 파일에서 publishConfig를 registry로 설정합니다.

패키지 게시#

명령줄에서 또는 GitLab CI/CD로 패키지를 게시할 수 있습니다.

명령줄 사용#

패키지를 수동으로 게시하는 방법은 다음과 같습니다.

  • 다음 명령을 실행합니다.

    # Yarn 1 (Classic)
    yarn publish
    
    # Yarn 2+
    yarn npm publish
    

CI/CD 사용#

인스턴스 러너(기본) 또는 개인 러너(고급)로 패키지를 자동으로 게시할 수 있습니다. CI/CD로 게시할 때는 파이프라인 변수를 사용할 수 있습니다.

  1. 프로젝트 또는 그룹의 인증 토큰을 만듭니다.

    1. 상단 표시줄에서 Search or go to를 선택하고 프로젝트 또는 그룹을 찾습니다.
    2. 왼쪽 사이드바에서 Settings > Repository > Deploy Tokens를 선택합니다.
    3. read_package_registry 및 write_package_registry 범위를 가진 배포 토큰을 만들고 생성된 토큰을 복사합니다.
    4. 왼쪽 사이드바에서 Settings > CI/CD > Variables를 선택합니다.
    5. Add variable을 선택하고 다음 설정을 사용합니다.
    필드 값
    key NPM_AUTH_TOKEN
    value
    type Variable
    Protected variable CHECKED
    Mask variable CHECKED
    Expand variable CHECKED
  2. 선택 사항. 보호된 변수를 사용하려면 다음을 진행합니다.

    1. Yarn 패키지 소스 코드가 있는 리포지터리로 이동합니다.
    2. 왼쪽 사이드바에서 Settings > Repository를 선택합니다.
      • 태그가 있는 브랜치에서 빌드한다면 Protected Tags를 선택하고 시맨틱 버전 관리를 위해 v*(와일드카드)를 추가합니다.
      • 태그가 없는 브랜치에서 빌드한다면 Branch rules를 선택합니다.
  3. package.json 이 있는 패키지 프로젝트 루트 디렉터리의 .yarnrc.yml 구성에 앞에서 만든 NPM_AUTH_TOKEN을 추가합니다.

    npmScopes:
      <my-org>:
        npmPublishRegistry: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/'
        npmAlwaysAuth: true
        npmAuthToken: '${NPM_AUTH_TOKEN}'
    

    이 구성에서 <my-org>는 @ 기호를 제외한 조직 범위로 바꿉니다.

  1. package.json 이 있는 패키지 프로젝트 루트 디렉터리의 .yarnrc.yml 구성에 CI_JOB_TOKEN을 추가합니다.

    npmScopes:
      <my-org>:
        npmPublishRegistry: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/'
        npmAlwaysAuth: true
        npmAuthToken: '${CI_JOB_TOKEN}'
    

    이 구성에서 <my-org>는 @ 기호를 제외한 조직 범위로 바꿉니다.

  2. .yarnrc.yml 이 있는 GitLab 프로젝트에서 .gitlab-ci.yml 파일을 편집하거나 새로 만듭니다. 예를 들어 태그 푸시에서만 트리거하려면 다음과 같이 작성합니다.

    Yarn 1의 경우:

    image: node:lts
    
    stages:
      - deploy
    
    rules:
    - if: $CI_COMMIT_TAG
    
    deploy:
      stage: deploy
      script:
        - yarn publish
    

    Yarn 2 이상의 경우:

    image: node:lts
    
    stages:
      - deploy
    
    rules:
      - if: $CI_COMMIT_TAG
    
    deploy:
      stage: deploy
      before_script:
        - corepack enable
        - yarn set version stable
      script:
        - yarn npm publish
    

파이프라인이 실행되면 패키지가 패키지 레지스트리에 추가됩니다.

패키지 설치#

인스턴스 또는 프로젝트에서 설치할 수 있습니다. 이름과 버전이 같은 패키지가 여러 개 있으면 패키지를 설치할 때 가장 최근에 게시된 패키지만 가져옵니다.

범위가 지정된 패키지 이름#

인스턴스에서 설치하려면 패키지 이름에 범위가 지정되어 있어야 합니다. 패키지 범위는 .yarnrc.yml 파일과 package.json의 publishConfig 옵션에서 설정할 수 있습니다. 프로젝트나 그룹에서 설치한다면 패키지 이름 규칙을 따르지 않아도 됩니다.

패키지 범위는 @로 시작하며 @owner/package-name 형식을 따릅니다.

  • @owner는 패키지 소스 코드가 있는 프로젝트의 루트가 아니라 패키지를 호스팅하는 최상위 프로젝트입니다.
  • 패키지 이름은 무엇이든 가능합니다.

예를 들면 다음과 같습니다.

프로젝트 URL 패키지 레지스트리 조직 범위 전체 패키지 이름
https://gitlab.com/<my-org>/<group-name>/<package-name-example> Package Name Example @my-org @my-org/package-name
https://gitlab.com/<example-org>/<group-name>/<project-name> Project Name @example-org @example-org/project-name

인스턴스에서 설치#

같은 조직 범위에서 여러 패키지를 다룬다면 인스턴스에서 설치하는 방안을 고려합니다.

  1. 조직 범위를 구성합니다. .yarnrc.yml 파일에 다음을 추가합니다.

    npmScopes:
     <my-org>:
       npmRegistryServer: 'https://<domain_name>/api/v4/packages/npm'
    
    • <my-org>는 패키지를 설치할 프로젝트의 루트 수준 그룹으로 바꾸고 @ 기호는 제외합니다.
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
  2. 선택 사항. 패키지가 비공개라면 패키지 레지스트리 액세스를 구성해야 합니다.

    npmRegistries:
      //<domain_name>/api/v4/packages/npm:
        npmAlwaysAuth: true
        npmAuthToken: '<token>'
    
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
  3. Yarn으로 패키지를 설치합니다.

그룹 또는 프로젝트에서 설치#

일회성 패키지라면 그룹이나 프로젝트에서 설치할 수 있습니다.

  1. 그룹 범위를 구성합니다. .yarnrc.yml 파일에 다음을 추가합니다.

    npmScopes:
      <my-org>:
        npmRegistryServer: 'https://<domain_name>/api/v4/groups/<group_id>/-/packages/npm'
    
    • <my-org>는 설치하려는 그룹을 포함하는 최상위 그룹으로 바꿉니다. @ 기호는 제외합니다.
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <group_id>는 그룹 개요 페이지에서 확인할 수 있는 그룹 ID로 바꿉니다.
  2. 선택 사항. 패키지가 비공개라면 레지스트리를 설정해야 합니다.

    npmRegistries:
      //<domain_name>/api/v4/groups/<group_id>/-/packages/npm:
        npmAlwaysAuth: true
        npmAuthToken: "<token>"
    
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
    • <group_id>는 그룹 개요 페이지에서 확인할 수 있는 그룹 ID로 바꿉니다.
  3. Yarn으로 패키지를 설치합니다.

  1. 프로젝트 범위를 구성합니다. .yarnrc.yml 파일에 다음을 추가합니다.

    npmScopes:
     <my-org>:
       npmRegistryServer: "https://<domain_name>/api/v4/projects/<project_id>/packages/npm"
    
    • <my-org>는 설치하려는 프로젝트를 포함하는 최상위 그룹으로 바꿉니다. @ 기호는 제외합니다.
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
  2. 선택 사항. 패키지가 비공개라면 레지스트리를 설정해야 합니다.

    npmRegistries:
      //<domain_name>/api/v4/projects/<project_id>/packages/npm:
        npmAlwaysAuth: true
        npmAuthToken: "<token>"
    
    • <domain_name>은 도메인 이름으로 바꿉니다(예: gitlab.com).
    • <token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
    • <project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
  3. Yarn으로 패키지를 설치합니다.

Yarn으로 설치#

  • 명령줄이나 CI/CD 파이프라인에서 yarn add를 실행합니다.
yarn add @scope/my-package

Yarn Classic에는 .npmrc 파일과 .yarnrc 파일이 모두 필요합니다. 자세한 내용은 Yarn issue 4451을 참고합니다.

  1. 자격 증명은 .npmrc 파일에, 범위가 지정된 레지스트리는 .yarnrc 파일에 넣습니다.

    # .npmrc
    ## For the instance
    //<domain_name>/api/v4/packages/npm/:_authToken='<token>'
    ## For the group
    //<domain_name>/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
    ## For the project
    //<domain_name>/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'
    
    # .yarnrc
    ## For the instance
    '@scope:registry' 'https://<domain_name>/api/v4/packages/npm/'
    ## For the group
    '@scope:registry' 'https://<domain_name>/api/v4/groups/<group_id>/-/packages/npm/'
    ## For the project
    '@scope:registry' 'https://<domain_name>/api/v4/projects/<project_id>/packages/npm/'
    
  2. 명령줄이나 CI/CD 파이프라인에서 yarn add를 실행합니다.

    yarn add @scope/my-package
    

Yarn 패키지 삭제#

사전 요구 사항:

  • Maintainer 또는 Owner 권한이 있어야 합니다.

패키지를 삭제하기 전에 관련 보안 위험을 파악해야 합니다.

패키지를 삭제하는 방법은 다음 두 가지입니다.

관련 주제#

문제 해결#

npm 레지스트리의 패키지 레지스트리에서 Yarn 실행 오류#

Yarn을 npm 레지스트리와 함께 사용하면 다음과 같은 오류 메시지가 나타날 수 있습니다.

yarn install v1.15.2
warning package.json: No license field
info No lockfile found.
warning XXX: No license field
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error An unexpected error occurred: "https://gitlab.example.com/api/v4/projects/XXX/packages/npm/XXX/XXX/-/XXX/XXX-X.X.X.tgz: Request failed \"404 Not Found\"".
info If you think this is a bug, please open a bug report with the information provided in "/Users/XXX/gitlab-migration/module-util/yarn-error.log".
info Visit https://classic.yarnpkg.com/en/docs/cli/install for documentation about this command

이 경우 다음 명령은 현재 디렉터리에 .yarnrc라는 파일을 만듭니다. 전역 구성이라면 사용자 홈 디렉터리에서, 프로젝트별 구성이라면 프로젝트 루트에서 실행해야 합니다.

yarn config set '//gitlab.example.com/api/v4/projects/<project_id>/packages/npm/:_authToken' '<token>'
yarn config set '//gitlab.example.com/api/v4/packages/npm/:_authToken' '<token>'

그룹 설치에서 tarball을 가져올 때 Yarn Classic 이 404 Not Found를 반환#

Yarn Classic으로 그룹의 레지스트리에서 패키지를 설치하면 패키지 확인은 성공하지만 tarball 다운로드가 404 Not Found 오류로 실패할 수 있습니다.

[1/4] Resolving packages...
[2/4] Fetching packages...
error Error: https://gitlab.example.com/api/v4/projects/<project_id>/packages/npm/@scope/my-package/-/@scope/my-package-1.0.0.tgz: Request failed "404 Not Found"

이 오류는 그룹 레지스트리가 반환하는 패키지 메타데이터에 프로젝트 엔드포인트를 가리키는 tarball 다운로드 URL 이 들어 있기 때문에 발생합니다. .npmrc 파일에 그룹 엔드포인트의 인증 토큰만 있으면 프로젝트 엔드포인트로 보내는 요청은 인증되지 않은 상태가 되어 404를 반환합니다.

이 문제를 해결하려면 .npmrc 파일에 그룹 엔드포인트와 프로젝트 엔드포인트의 인증 토큰을 모두 추가합니다.

# .npmrc
//gitlab.example.com/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
//gitlab.example.com/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'

단축된 인증 경로에서 Yarn Classic 이 401 Unauthorized를 반환#

Yarn Classic을 GitLab 패키지 레지스트리와 함께 사용할 때 인증 토큰이 유효한데도 401 Unauthorized 오류가 발생할 수 있습니다. 오류 메시지는 다음과 같은 형태입니다.

error Couldn't find package "@scope/my-package" on the "npm" registry.

--verbose 플래그를 사용하면 로그에 401 상태 코드가 표시됩니다.

verbose Performing "GET" request to "https://gitlab.com/api/v4/groups/<group_id>/-/packages/npm/..."
verbose Request "https://gitlab.com/api/v4/groups/<group_id>/-/packages/npm/..." finished with status code 401.

이 문제는 .npmrc의 _authToken 항목이 전체 엔드포인트 경로가 아니라 단축된 상위 경로를 사용할 때 발생합니다. 예를 들면 다음과 같습니다.

# Does NOT work with Yarn Classic
//gitlab.com/api/v4/:_authToken='<token>'

npm 8 이상은 계층적 인증 매칭(상위 경로에 설정한 토큰이 모든 하위 경로에 적용되는 방식)을 지원하지만, Yarn Classic은 _authToken 항목과 레지스트리 URL의 경로가 정확히 일치해야 합니다.

이 문제를 해결하려면 .npmrc 파일에서 인증하는 레지스트리마다 전체 엔드포인트 경로를 사용합니다. 예를 들어 패키지가 특정 프로젝트에 호스팅된 그룹 레지스트리에서 설치하는 경우는 다음과 같습니다.

# .npmrc
//gitlab.com/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
//gitlab.com/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'

그룹 엔드포인트가 반환하는 패키지 메타데이터에 프로젝트 엔드포인트를 가리키는 tarball 다운로드 URL 이 들어 있으므로 프로젝트 항목이 필요합니다.

yarn install 이 의존성으로 리포지터리를 클론하는 데 실패#

Dockerfile에서 yarn install을 사용하면 Dockerfile을 빌드할 때 다음과 같은 오류가 발생할 수 있습니다.

...
#6 8.621 fatal: unable to access 'https://gitlab.com/path/to/project/': Problem with the SSL CA cert (path? access rights?)
#6 8.621 info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
#6 ...

이 문제를 해결하려면 .dockerignore 파일의 Yarn 관련 경로마다 느낌표(!)를 추가합니다.

**

!./package.json
!./yarn.lock
...