이 출시되었습니다! 11월의 새로운 기능 및 수정 사항을 읽어보세요.

가상 작업 공간

GitHub Repositories 확장과 같은 확장은 파일 시스템 공급자에 의해 지원되는 하나 이상의 폴더에서 VS Code를 엽니다. 확장이 파일 시스템 공급자를 구현하면 작업 영역 리소스가 로컬 디스크에 있지 않고 **가상**으로 서버 또는 클라우드에 위치할 수 있으며 편집 작업은 해당 위치에서 수행됩니다.

이 구성을 가상 작업 영역이라고 합니다. 가상 작업 영역이 VS Code 창에서 열리면 다른 원격 개발 창과 유사하게 왼쪽 하단 모서리에 있는 원격 표시기 레이블에 표시됩니다.

Remote indicator

모든 확장이 가상 리소스와 함께 작동하는 것은 아니며 디스크에 리소스가 필요할 수 있습니다. 일부 확장은 디스크 액세스에 의존하는 도구를 사용하거나 동기식 파일 액세스가 필요하거나 필요한 파일 시스템 추상화가 없습니다. 이러한 경우 가상 작업 영역에서는 VS Code가 제한된 모드에서 실행 중이고 일부 확장이 비활성화되었거나 제한된 기능으로 작동한다는 것을 사용자에게 알립니다.

일반적으로 사용자는 가능한 한 많은 확장이 가상 작업 영역에서 작동하고 원격 리소스를 탐색하고 편집할 때 좋은 사용자 환경을 갖기를 원합니다. 이 가이드는 확장이 가상 작업 영역에 대해 테스트하는 방법을 보여주고, 가상 작업 영역에서 작동하도록 수정하는 방법을 설명하고, virtualWorkspaces 기능 속성을 소개합니다.

확장을 가상 작업 영역에서 작동하도록 수정하는 것은 VS Code for the Web에서 잘 작동하기 위한 중요한 단계이기도 합니다. VS Code for the Web은 브라우저 내에서 완전히 실행되며 브라우저 샌드박스로 인해 작업 영역은 가상입니다. 자세한 내용은 웹 확장 가이드를 참조하십시오.

내 확장이 영향을 받습니까?

테마, 키 바인딩, 스니펫 또는 문법 확장과 같이 실행 가능한 코드가 없고 순전히 선언적인 확장은 가상 작업 영역에서 실행될 수 있으며 수정이 필요하지 않습니다.

코드가 있는 확장, 즉 main 진입점을 정의하는 확장은 검사 및 가능한 경우 수정이 필요합니다.

가상 작업 영역에서 확장 실행

GitHub Repositories 확장을 설치하고 명령 팔레트에서 Open GitHub Repository... 명령을 실행합니다. 이 명령은 빠른 선택 드롭다운을 표시하며 GitHub URL을 붙여넣거나 특정 저장소 또는 풀 요청을 검색하도록 선택할 수 있습니다.

그러면 모든 리소스가 가상인 가상 작업 영역에 대한 VS Code 창이 열립니다.

확장 코드가 가상 리소드에 대해 준비되었는지 검토

가상 파일 시스템에 대한 VS Code API 지원은 꽤 오래되었습니다. 파일 시스템 공급자 API를 확인해 볼 수 있습니다.

새로운 URI 스키마(예: vscode-vfs)에 대해 파일 시스템 공급자가 등록되며 해당 파일 시스템의 리소스는 해당 스키마를 사용하는 URI(vscode-vfs://github/microsoft/vscode/package.json)로 표현됩니다.

VS Code API에서 반환된 URI를 처리하는 방법 확인

  • URI 스키마가 file이라고 가정하지 마십시오. URI.fsPath는 URI 스키마가 file인 경우에만 사용할 수 있습니다.
  • 파일 시스템 작업을 위해 fs 노드 모듈 사용을 찾아보십시오. 가능한 경우 vscode.workspace.fs API를 사용하십시오. 이 API는 적절한 파일 시스템 공급자로 위임됩니다.
  • fs 액세스에 의존하는 타사 구성 요소(예: 언어 서버 또는 노드 모듈)를 확인합니다.
  • 명령에서 실행 파일 및 작업을 실행하는 경우 이러한 명령이 가상 작업 영역 창에서 의미가 있는지 또는 비활성화되어야 하는지 확인합니다.

확장이 가상 작업 영역을 처리할 수 있는지 신호

package.jsoncapabilities 아래에 있는 virtualWorkspaces 속성은 확장이 가상 작업 영역에서 작동하는지 여부를 신호하는 데 사용됩니다.

가상 작업 영역 지원 없음

아래 예시는 확장이 가상 작업 영역을 지원하지 않으며 이 설정에서 VS Code에서 사용되지 않아야 함을 선언합니다.

{
  "capabilities": {
    "virtualWorkspaces": {
      "supported": false,
      "description": "Debugging is not possible in virtual workspaces."
    }
  }
}

가상 작업 영역에 대한 부분 및 전체 지원

확장이 가상 작업 영역에서 작동하거나 부분적으로 작동하는 경우 "virtualWorkspaces": true를 정의해야 합니다.

{
  "capabilities": {
    "virtualWorkspaces": true
  }
}

확장이 작동하지만 기능이 제한된 경우 사용자에게 제한 사항을 설명해야 합니다.

{
  "capabilities": {
    "virtualWorkspaces": {
      "supported": "limited",
      "description": "In virtual workspaces, resolving and finding references across files is not supported."
    }
  }
}

설명은 확정 보기에서 표시됩니다.

Extensions view

확장은 아래 설명과 같이 가상 작업 영역에서 지원되지 않는 기능을 비활성화해야 합니다.

기본값

"virtualWorkspaces": truevirtualWorkspaces 기능이 아직 채워지지 않은 모든 확장에 대한 기본값입니다.

그러나 가상 작업 영역을 테스트하는 동안 가상 작업 영역에서 비활성화해야 한다고 생각하는 확장 목록을 만들었습니다. 이 목록은 issue #122836에서 찾을 수 있습니다. 이러한 확장은 기본적으로 "virtualWorkspaces": false입니다.

물론 확장 작성자가 이 결정을 내리는 데 더 나은 위치에 있습니다. 확장의 package.json에 있는 virtualWorkspaces 기능은 기본값을 재정의하며 목록은 결국 폐기될 것입니다.

가상 작업 영역이 열릴 때 기능 비활성화

명령 및 보기 기여 비활성화

명령 및 보기의 가용성 및 기타 많은 기여는 when 절의 컨텍스트 키를 통해 제어할 수 있습니다.

virtualWorkspace 컨텍스트 키는 모든 작업 영역 폴더가 가상 파일 시스템에 있을 때 설정됩니다. 아래 예시는 가상 작업 영역이 아닐 때만 명령 팔레트에 npm.publish 명령을 표시합니다.

{
  "menus": {
    "commandPalette": [
      {
        "command": "npm.publish",
        "when": "!virtualWorkspace"
      }
    ]
  }
}

resourceScheme 컨텍스트 키는 파일 탐색기에서 현재 선택된 요소 또는 편집기에서 열린 요소의 URI 스키마로 설정됩니다.

아래 예시에서 npm.runSelectedScript 명령은 기본 리소스가 로컬 디스크에 있는 경우에만 편집기 컨텍스트 메뉴에 표시됩니다.

{
  "menus": {
    "editor/context": [
      {
        "command": "npm.runSelectedScript",
        "when": "resourceFilename == 'package.json' && resourceScheme == file"
      }
    ]
  }
}

프로그래밍 방식으로 가상 작업 영역 감지

현재 작업 영역이 비file 스키마로 구성되어 있고 가상인지 확인하려면 다음 소스 코드를 사용할 수 있습니다.

const isVirtualWorkspace =
  workspace.workspaceFolders &&
  workspace.workspaceFolders.every(f => f.uri.scheme !== 'file');

언어 확장 및 가상 작업 영역

가상 작업 영역에 대한 언어 지원의 기대치는 무엇입니까?

모든 확장이 가상 리소스와 완전히 함께 작동하는 것은 현실적이지 않습니다. 많은 확장이 동기식 파일 액세스 및 디스크상의 파일이 필요한 외부 도구를 사용합니다. 따라서 아래 나열된 **기본** 및 **단일 파일** 지원과 같이 제한된 기능만 제공하는 것도 괜찮습니다.

A. **기본** 언어 지원

  • TextMate 토큰화 및 색상화
  • 언어별 편집 지원: 괄호 쌍, 주석, 입력 규칙, 접기 표시기
  • 코드 조각

B. **단일 파일** 언어 지원

  • 문서 기호(개요), 접기, 선택 범위
  • 문서 강조 표시, 의미론적 강조 표시, 문서 색상
  • 현재 파일 및 정적 언어 라이브러리의 기호를 기반으로 하는 완성, 호버, 시그니처 도움말, 참조/선언 찾기
  • 서식 지정, 연결된 편집
  • 구문 유효성 검사 및 동일 파일 의미론적 유효성 검사 및 코드 액션

C. **크로스 파일, 작업 영역 인식** 언어 지원

  • 파일 간 참조
  • 작업 영역 기호
  • 작업 영역/프로젝트의 모든 파일 유효성 검사

VS Code와 함께 제공되는 풍부한 언어 확장(TypeScript, JSON, CSS, HTML, Markdown)은 가상 리소스에서 작업할 때 단일 파일 언어 지원으로 제한됩니다.

언어 확장 비활성화

단일 파일 작업이 옵션이 아닌 경우 언어 확장은 가상 작업 영역에서 확장을 비활성화하도록 선택할 수도 있습니다.

확장이 문법과 비활성화해야 하는 풍부한 언어 지원을 모두 제공하는 경우 문법도 비활성화됩니다. 이를 피하려면 풍부한 언어 지원과 별도로 기본 언어 확장(문법, 언어 구성, 스니펫)을 만들고 두 개의 확장을 가질 수 있습니다.

  • 기본 언어 확장은 "virtualWorkspaces": true이며 언어 ID, 구성, 문법 및 스니펫을 제공합니다.
  • 풍부한 언어 확장은 "virtualWorkspaces": false이며 main 파일을 포함합니다. 언어 지원, 명령을 기여하고 기본 언어 확장에 대한 확장 종속성(extensionDependencies)을 가집니다. 풍부한 언어 확장은 기존 확장의 확장 ID를 유지해야 하므로 사용자는 단일 확장을 설치하여 전체 기능을 계속 사용할 수 있습니다.

JSON과 같은 내장 언어 확장을 통해 이 접근 방식을 볼 수 있으며, 이는 JSON 확장과 JSON 언어 기능 확장으로 구성됩니다.

이 분리는 제한 모드에서 실행되는 신뢰할 수 없는 작업 영역과도 도움이 됩니다. 풍부한 언어 확장은 종종 신뢰가 필요한 반면 기본 언어 기능은 모든 설정에서 실행될 수 있습니다.

언어 선택기

언어 기능(예: 완성, 호버, 코드 액션 등)에 대한 공급자를 등록할 때 공급자가 지원하는 스키마를 지정해야 합니다.

return vscode.languages.registerCompletionItemProvider(
  { language: 'typescript', scheme: 'file' },
  {
    provideCompletionItems(document, position, token) {
      // ...
    }
  }
);

가상 리소스에 액세스하기 위한 언어 서버 프로토콜(LSP) 지원은 어떻게 됩니까?

LSP에 파일 시스템 공급자 지원을 추가하는 작업이 진행 중입니다. 언어 서버 프로토콜 issue #1264에서 추적됩니다.

© . This site is unofficial and not affiliated with Microsoft.