devcontainer для проекта ROS2


Резюме

В этой статье я хочу поделиться тем, как создать локальную среду разработки для ROS2-проектов. В последнее время разработка кода, например, на фреймворке ROS2, стала очень сложной и сильно зависит от пакетов OSS. Контейнер devcontainer VS Code значительно упрощает создание локальной среды разработки.

TOC

  • Обзор
  • devcontainer.json
  • Dockerfile
  • Структура каталога
    • Как запустить среду разработки контейнера docker
    • Где находится каталог проекта?
    • Эксперимент 1
    • Эксперимент 2
    • Эксперимент 3

Обзор

devcontainer — это одна из функций Visual Studio Code Remote Development, которая помогает создать локальную среду разработки. Лично я люблю Windows OS и Visual Studio при разработке приложений .NET C#, но при разработке на других языках, таких как Python, Typescript и т.д., devcontainer в VS Code действительно очень полезен. Вот мое личное мнение о том, почему он так полезен.

  • Независимость от операционной системы вашей машины: По данным statistica.com, в 2022 году доля Windows на мировом рынке операционных систем составит около 75 процентов. В сочетании с технологией WSL (Windows Subsystem for Linux) devcontainer VS Code позволяет запускать среду разработки Linux на машине с Windows.

  • Комбинации версий пакетов: В общем, вы хотите разделить среду разработки в зависимости от проектов. Например, вы можете использовать pyenv, virtualenv, conda или любую другую виртуальную среду, которую вы предпочитаете для Python. Однако, когда вы хотите объединить среду Python с другим фреймворком, например, ROS2, это будет сложнее. VS Code devcontainer решает эту проблему, создавая вовремя docker-контейнер для каждой среды разработки.

  • Нет необходимости устанавливать все зависимости с нуля: Чтобы создать среду разработки «точно в срок», вам не нужно устанавливать все зависимости с нуля. Вы можете использовать общедоступные образы из известного реестра контейнеров. Например, я использую образ ros:foxy-ros-base-focal для своей среды разработки ROS2 — Dockerfile

  • Отладчик: Visual Studio Code поддерживает отладчики для разных языков. Для данного примера — devcontainer.json, используется расширение VS Code ms-python, с помощью которого вы можете запустить отладчик Python на вашей локальной машине.

  • Поддержка и расширения VS Code: VS Code имеет встроенную поддержку и множество расширений для различных языков. Вы можете использовать эту поддержку даже в среде разработки docker-контейнера devcontainer.

.devcontainer/devcontainer.json

Пример devcontainer.json выглядит следующим образом.

  • dockerfile: Это указывает на Dockerfile, расположенный в той же папке, что и devcontainer.json в каталоге .devcontainer.
  • workspaceFolder: Каталог в контейнере docker, в котором существует каталог .devcontainer.
  • extensions (расширения): Расширения VS Code, которые вы хотите использовать в среде разработки docker contaienr.
{
  "name": "ROS devcontainer",
  "dockerFile": "Dockerfile",
  "workspaceFolder": "/workspaces/EdgeIntegrationTest/src/apps/FileGenerator",
  "settings": {},
  "extensions": [
        "ms-python.python"
    ]
}
Вход в полноэкранный режим Выйти из полноэкранного режима

.devcontainer/Dockerfile

Пример Dockerfile в каталоге .devcontainer выглядит следующим образом.

FROM ros:foxy-ros-base-focal

SHELL ["/bin/bash", "-c"]

WORKDIR /app

COPY requirements.txt ./
RUN apt update && apt install -y 
    python3-pip 
    python3-colcon-common-extensions
RUN pip install -r requirements.txt

RUN echo 'source /opt/ros/foxy/setup.bash' >> /root/.bashrc
Вход в полноэкранный режим Выход из полноэкранного режима

Расположение файла setup.bash в докер-контейнере

/opt
└── ros
    └── foxy
        ├── _local_setup_util.py
        ├── bin
        ├── cmake
        ├── include
        ├── lib
        ├── local_setup.bash
        ├── local_setup.sh
        ├── local_setup.zsh
        ├── opt
        ├── setup.bash
        ├── setup.sh
        ├── setup.zsh
        ├── share
        ├── src
        └── tools
Вход в полноэкранный режим Выход из полноэкранного режима

Структура каталогов

Как запустить среду разработки контейнера docker

Шаг для открытия среды разработки выглядит следующим образом.

  1. Перейдите в терминал и измените каталог на тот, в котором находится папка .devcontainer.
  2. Запустите code . в вашем терминале, и вы увидите, что VS Code появится на экране.
  3. Перейдите в Open a Remote Window и выберите Reopen in Container, и вы увидите, что VS Code снова открыт с запущенным в контейнере docker.

Где находится каталог проекта?

В этом примере — .devcontainer, когда докер-контейнер VS Code открыт, вы увидите, что ваш каталог в докер-контейнере — /workspaces/EdgeIntegrationTest/src/apps/FileGenerator. Вы открыли devcontainer по адресу FileGenerator в каталоге вашей локальной машины. Однако контейнер docker скопировал каталог EdgeIntegrationTest на вашей локальной машине в каталог /workspaces в контейнере docker.

EdgeIntegrationTest
└── src
    └── apps
        └── FileGenerator
              ├── .devcontainer
              |   ├── Dockerfile
              |   ├── devcontainer.json
              |   └── requirements.txt
              ├── Dockerfile
              ├── main.py
              └── requirements.txt
Вход в полноэкранный режим Выйдите из полноэкранного режима

Это происходит потому, что ваш артикул "workspaceFolder": "/workspaces/EdgeIntegrationTest/src/apps/FileGenerator" в devcontainer.json? Нет. Если вы измените workspaceFolder в devcontainer.json на "workspaceFolder": "/workspaces/FileGenerator", вы увидите, что каталог EdgeIntegrationTest скопирован под /workspaces в контейнере docker и увидите ошибку ниже.

Похоже, что расширение VS Code Remote Development копирует каталог, в котором существует один .git, поверх вашего текущего каталога, в котором вы Reopen in Container. Я попробовал три эксперимента, приведенных ниже.

Эксперимент 1

Переоткройте в Container в FileGenerator на вашей локальной машине.

C:.
└── FileGenerator
    ├── .devcontainer
    |   ├── Dockerfile
    |   ├── devcontainer.json
    |   └── requirements.txt
    ├── Dockerfile
    ├── main.py
    └── requirements.txt

Войдите в полноэкранный режим Выйти из полноэкранного режима

Ваша директория в контейнере докера

root@xxxxxxx:/workspaces/FileGenerator# 
Войти в полноэкранный режим Выйти из полноэкранного режима

Эксперимент 2

Откройте в контейнере FileGenerator на вашей локальной машине

C:.
└── ProjectFolder1
    ├── .git
    └── FileGenerator
        ├── .devcontainer
        |   ├── Dockerfile
        |   ├── devcontainer.json
        |   └── requirements.txt
        ├── Dockerfile
        ├── main.py
        └── requirements.txt

Войти в полноэкранный режим Выйти из полноэкранного режима

Ваш каталог в докер-контейнере

root@xxxxxxx:/workspaces/ProjectFolder1/FileGenerator# 
Войти в полноэкранный режим Выйти из полноэкранного режима

Эксперимент 3

Откройте в контейнере FileGenerator на вашей локальной машине

C:.
└── ProjectFolder2
    ├── .git
    └── ProjectFolder1
        ├── .git
        └── FileGenerator
            ├── .devcontainer
            |   ├── Dockerfile
            |   ├── devcontainer.json
            |   └── requirements.txt
            ├── Dockerfile
            ├── main.py
            └── requirements.txt

Войти в полноэкранный режим Выйти из полноэкранного режима

Ваш каталог в докер-контейнере

root@xxxxxxx:/workspaces/ProjectFolder1/FileGenerator# 
Войти в полноэкранный режим Выйти из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий