코드 지능 개발 지침
- GitLab 13.1에서 도입되었습니다.
이 문서에서는 코드 지능의 디자인에 대해 설명합니다.
GitLab의 내장된 코드 지능은 LSIF로 구동되며, 프로젝트의 CI 작업에서 LSIF 문서를 생성하고 데이터를 처리한 후 CI artifact로 업로드하여 프로젝트의 파일에 대한 정보를 표시하는 것으로 이어집니다.
다음은 LSIF artifact를 업로드하는 시퀀스 다이어그램입니다:
-
CI/CD 작업은 프로젝트의 언어에 대한 색인기를 사용하여 LSIF 형식(보통
dump.lsif
)의 문서를 생성합니다. 이 형식은 메소드 또는 함수와 해당 정의 또는 참조 사이의 상호작용을 설명합니다. 이 문서는 LSIF 보고서 artifact로 저장되도록 표시됩니다. -
Artifact를 저장하기 위한 요청을 받은 후, Workhorse는 GitLab Rails에 업로드를 승인하도록 요청합니다.
-
GitLab Rails는 업로드가 가능한지를 검증하고, LSIF artifact를 처리할 수 있는 경우
ProcessLsif: true
헤더를 보냅니다. -
Workhorse는 LSIF 문서를 한 줄씩 읽고 프로젝트의 각 파일에 대해 코드 지능 데이터를 생성합니다. 결과물은 프로젝트 구조를 모방하는 JSON 파일들의 압축 된 디렉토리입니다.
프로젝트:
app controllers application_controller.rb models application.rb
생성된 데이터:
app controllers application_controller.rb.json models application.rb.json
-
압축 된 디렉토리는 ZIP artifact로 저장됩니다. Workhorse는 원래의 LSIF 문서를 ZIP artifact의 일련의 JSON 파일로 교체하고 이를 위한 메타데이터를 생성합니다. 이 메타데이터를 통해 전체 파일을 압축 해제하지 않거나 로드하지 않고도 ZIP 파일의 단일 파일을 볼 수 있게 됩니다. 이를 통해 단일 파일의 코드 지능 데이터에 액세스할 수 있습니다.
-
파일이 GitLab 애플리케이션에서 보여질 때, 프론트엔드는 해당 파일에 대한 코드 지능 데이터를 개체 저장소에서 직접 가져옵니다. 이 파일은 파일 내의 코드 단위에 대한 정보를 포함합니다. 예를 들어:
[ { "definition_path": "cmd/check/main.go#L4", "hover": [ { "language": "go", "tokens": [ [ { "class": "kn", "value": "package" }, { "value": " " }, { "class": "s", "value": "\"fmt\"" } ] ] }, { "value": "Package fmt implements formatted I/O with functions analogous to C's printf and scanf. The format 'verbs' are derived from C's but are simpler. \n\n### hdr-PrintingPrinting\nThe verbs: \n\nGeneral: \n\n```\n%v\tthe value in a default format\n\twhen printing st..." } ], "start_char": 2, "start_line": 33 } ... ]