코드 지능 개발 지침
이 문서는 코드 지능 뒤의 디자인을 설명합니다.
GitLab의 내장된 코드 지능은 LSIF를 통해 구동되며 CI 작업에서 프로젝트의 LSIF 문서를 생성하고 데이터를 처리하여 CI 아티팩트로 업로드하고 프로젝트의 파일에 대한 이 정보를 표시하는 것으로 이어집니다.
다음은 LSIF 아티팩트를 업로드하는 시퀀스 다이어그램입니다:
-
CI/CD 작업은 프로젝트의 언어에 대한 인덱서를 사용하여 LSIF 형식의 문서(일반적으로
dump.lsif
)를 생성합니다. 이 형식은 메소드 또는 함수와 해당 정의 또는 참조 사이의 상호작용을 설명합니다. 문서는 LSIF 보고서 아티팩트로 저장되도록 표시됩니다. -
아티팩트를 저장하기 위한 요청을 수신한 후, Workhorse는 GitLab Rails에 업로드를 승인하도록 요청합니다.
-
GitLab Rails는 아티팩트를 업로드할 수 있는지 유효성을 검사하고, LSIF 아티팩트를 처리할 수 있는 경우
ProcessLsif: true
헤더를 보냅니다. -
Workhorse는 LSIF 문서를 한 줄씩 읽고 프로젝트의 각 파일에 대한 코드 지능 데이터를 생성합니다. 결과는 프로젝트 구조를 모방하는 JSON 파일의 압축된 디렉터리입니다:
프로젝트:
app controllers application_controller.rb models application.rb
생성된 데이터:
app controllers application_controller.rb.json models application.rb.json
-
압축된 디렉터리는 ZIP 아티팩트로 저장됩니다. Workhorse는 ZIP 아티팩트의 원본 LSIF 문서를 일련의 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 } ... ]