VScode에서 Rust의 보완 기능을 사용하려고 하는데 이동할 수 없습니다

12890 단어 DockerRustVS Codetech

통과(건너뛸 수 있음)


최근 업무상 C-클래스 언어를 사용해 사용법을 모르는 것은 아니지만, 메모리에서 방출됐느냐, 지침, 참조 교부 등 현대 프로그래밍 언어로 볼 때 굉장히 번거로운 일을 했다고 느낄 수 있다.(나는 결코 싫어하지 않는다.)
Rust의 존재가 C와 C++를 대체하는 것을 목표로 한다는 것은 알지만 한 번도 사용하지 않았다.
비교 대상인 C-클래스 언어를 어렵게 비즈니스에서 사용했기 때문에 이들과 비교할 때 Rust가 얼마나 우수한지 해보고 싶었고, 이것이 내가 Rust를 접하게 된 계기가 됐다.

메시지


나는 컴퓨터에 컴파일러 같은 것을 많이 넣어서 환경을 오염시키는 것을 좋아하지 않는다.
기본적으로 Docker 내에서 환경을 구축하고 그 안에서 놀아요.
Docker로 환경을 구축하는 것 자체가 그리 어려운 일은 아니다.(집에서 하면)
다음 구성을 통해 Rust를 조금이나마 수행할 수 있는 환경을 구축했다.
Dockerfile
FROM rust:1.48-buster
RUN apt-get update & apt-get install git
RUN cargo install cargo-edit #←予め入れて置いた方がいい、結構重め
docker-compose.yml
version: "3"

services:
  rust-app:
    container_name: "rust-app"
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    volumes:
      - ..:/workspace.rust/src/app
.devcontainer.json
{
    "name": "Learning Rust",
    "dockerComposeFile": "docker-compose.yml",
    "service": "rust-app",
    "workspaceFolder": "/workspace.rust",
    // Use this environment variable if you need to bind mount your local source code into a new container.
    "remoteEnv": {
        "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}",
    },
    // Set *default* container specific settings.json values on container create.
    "settings": {
        "terminal.integrated.shell.linux": "/bin/bash"
    },
    // Add the IDs of extensions you want installed when the container is created.
    "extensions": [
        "ms-azuretools.vscode-docker",
    ],
    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [],
    // Use 'postCreateCommand' to run commands after the container is created.
    // "postCreateCommand": "docker --version",
    // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
}
그럼 이것만으로도 리모트 컨테이너를 컨테이너에 연결해 Rust로 놀 수 있다.
하지만 Rust의 확장 기능을 원합니다.
다 채우지 못해서 좀 엄격해요.
첫 번째 선택은 다음과 같습니다.
https://marketplace.visualstudio.com/items?itemName=rust-lang.rust
이렇게 하면 보충도 효과가 있고 커서로 하면 doc도 볼 수 있어서 정말 큰 도움이 됐어요!!!
이런 시기도 있었고...

잘 못 써요.


전혀 보완되지 않아 아무래도 1046791410에 외부 크레인을 설치해도 보완 기능이 반응하지 않아 설치됐는데도 읽지 못했다.
컨테이너를 다시 열면(Remote-Containers:Reopen 명령) 읽을 수 있지만 하나하나 다시 열기도 번거롭다.
확장 기능에 대한 설명을 자세히 읽은 후 다음과 같은 설명이 있습니다.
This extension is deliberately conservative about snippets and doesn't include too many. If you want more, check out Trusty Rusty Snippets.
다 채우기에는 안 어울릴 것 같아요.
나는 그곳에서 다른 확장 기능이 있는지 찾아보고 싶다. 사이트의 설명문에는 또 다른languageserver도 소개되어 있다.
Rust support is powered by a separate language server - either by the official Rust Language Server (RLS) or rust-analyzer, depending on the user's preference. If you don't have it installed, the extension will install it for you (with permission).
rust-analyzer 같은 것도 있는 것 같아요.

더 이상 소용없다


나는 즉시 rust-analyzer를 확장하여 설치했다.
https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer
버젼에서도 알 수 있듯이 아직 개발 중인 랑uage 서버지만 RLS보다 보완 기능이 더 핫한 것 같다.
근데 또 안 움직여.
뿐만 아니라 나는 잘못도 토해냈다.
rust-analyzer failed to discover workspace
작업공간을 찾을 수 없습니다...?

원인을 조사하다


rust-analyzer를 가져올 때 폴더는 다음과 같이 구성됩니다.
한 작업 공간에 여러 항목이 있다.
그리고 작업 공간이 확실히 존재한다.
.devcontainer.제이슨.rust로 명시적으로 지정합니다.
뭐가 나쁜데?
workspace.rust/
  └src/
    └app/
      ├sample1/
      │  ├src/
      │  │  └main.rs
      │  └Cargo.toml
      ├sample2/
      │  ├src/
      │  │  └main.rs
      │  └Cargo.toml
      ├sample3/
      │  ├src/
      │  │  └main.rs
      │  └Cargo.toml
      └sample4/
         ├src/
         │  └main.rs
         └Cargo.toml

까닭


결론적으로 한 작업 공간에 여러 항목이 존재하기 때문이다.
다음은 원인이 판명된 github의 Issue 링크입니다.
https://github.com/rust-analyzer/rust-analyzer/issues/1834
현재 단계는 단일 작업 공간에서 하나의 프로젝트가 아니라면 운영되지 않는다.
다만 복수 지원 준비 자체는 정비 중인 듯 검증이 부족해 이뤄지지 않았다.

수정 및 개선


결과는 다음과 같다.
Dockerfile
FROM rust:1.48-buster
RUN apt-get update & apt-get install git
RUN rustup component add rust-src #新規追加、rust-analyzer導入時に必要
RUN cargo install cargo-edit #←予め入れて置いた方がいい、結構重め
docker-compose.yml
version: "3"

services:
  rust-app:
    container_name: "rust-app"
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    volumes:
      - ..:/workspace.rust
.devcontainer.json
{
    "name": "Learning Rust",
    "dockerComposeFile": "docker-compose.yml",
    "service": "rust-app",
    "workspaceFolder": "/workspace.rust",
    // Use this environment variable if you need to bind mount your local source code into a new container.
    "remoteEnv": {
        "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}",
    },
    // Set *default* container specific settings.json values on container create.
    "settings": {
        "terminal.integrated.shell.linux": "/bin/bash"
    },
    // Add the IDs of extensions you want installed when the container is created.
    "extensions": [
        "ms-azuretools.vscode-docker",
	/// rust-analyzerを設定 ///
	"matklad.rust-analyzer",
    ],
    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [],
    // Use 'postCreateCommand' to run commands after the container is created.
    // "postCreateCommand": "docker --version",
    // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
}
폴더 설정을 간단한 형태로 수정했습니다.
1046791310 컨테이너를 재건하여 컨테이너에 연결하면...

rust-analyzer는 무사히 반응했다.

좋은 웹페이지 즐겨찾기