# 패키지 의존성 관리 및 수정 방법

#### 의존성 정의

ROS2 패키지에서 의존성 관리란, 패키지가 정상적으로 작동하기 위해 필요한 다른 패키지들을 정의하고 이를 추적하는 과정을 의미한다. ROS2 패키지에서 의존성을 정의하는 가장 기본적인 방법은 `package.xml` 파일에 의존성을 명시하는 것이다. `package.xml` 파일은 패키지 메타데이터를 정의하는 파일로, 패키지의 이름, 버전, 라이센스 정보, 빌드 도구, 의존하는 패키지 등을 기술한다.

```xml
<build_depend>rclcpp</build_depend>
<exec_depend>sensor_msgs</exec_depend>
<test_depend>gtest</test_depend>
```

* **build\_depend**: 패키지를 빌드하는 데 필요한 의존성을 정의한다.
* **exec\_depend**: 패키지 실행에 필요한 의존성을 정의한다.
* **test\_depend**: 테스트 실행 시 필요한 의존성을 정의한다.

이러한 의존성 구분은 ROS2 패키지의 설치 및 실행을 명확하게 할 수 있도록 도움을 준다.

#### 의존성 해결

ROS2는 의존성 해결을 위해 다양한 도구와 방식을 제공한다. `colcon`은 ROS2에서 주로 사용되는 빌드 도구로, 패키지 간의 의존성을 관리하고 빌드 순서를 결정한다. `colcon`을 사용하면 패키지가 의존하는 모든 패키지를 먼저 빌드한 후, 해당 패키지를 빌드하는 방식으로 의존성을 해결한다.

```bash
colcon build
```

의존성 문제로 인해 빌드가 실패할 경우, `package.xml`에 누락된 의존성이 없는지 확인하고 추가해야 한다.

#### 의존성 수정

패키지의 의존성 수정은 주로 다음과 같은 경우에 이루어진다:

1. 새로운 기능을 추가하면서 새로운 패키지에 의존해야 할 때
2. 기존 의존성을 제거하거나 대체할 때
3. 의존 패키지의 버전 변경에 따른 업데이트가 필요할 때

의존성을 수정할 때는 `package.xml` 파일과 `CMakeLists.txt` 파일을 함께 수정해야 한다. 의존하는 패키지를 추가하거나 제거하는 경우, `package.xml`에서 관련 의존성을 수정하고, `CMakeLists.txt` 파일에서도 관련 링크를 설정해야 한다.

```cmake
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
```

이와 같이 `find_package()`를 통해 의존 패키지를 찾아오고, 빌드 과정에서 해당 패키지를 포함한다. 만약 의존성이 잘못되었거나 누락되었다면, 빌드 과정에서 에러가 발생할 수 있다.

#### CMakeLists.txt에서 의존성 관리

`CMakeLists.txt` 파일은 패키지를 빌드하는 방법을 정의하는 파일로, 패키지 의존성 또한 이 파일을 통해 관리된다. 이때 의존성을 정의하는 기본적인 방법은 `find_package()` 명령어를 사용하는 것이다. 예를 들어, `rclcpp` 패키지에 의존하는 패키지를 작성하는 경우, `CMakeLists.txt` 파일에는 다음과 같이 의존성을 명시한다:

```cmake
find_package(rclcpp REQUIRED)
```

이 명령어는 빌드 시스템이 `rclcpp` 패키지를 찾고, 패키지를 빌드할 때 해당 라이브러리를 포함하게 한다. 또한 의존 패키지에서 제공하는 메시지, 서비스 등의 인터페이스를 사용할 때, `CMakeLists.txt`에 다음과 같은 추가 설정이 필요할 수 있다.

```cmake
add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp sensor_msgs)
```

`ament_target_dependencies()`는 노드가 의존하는 패키지를 명시하는 함수로, 위 예제에서는 `rclcpp`와 `sensor_msgs` 패키지에 의존하는 노드를 정의하고 있다.

#### ROS2에서 의존성 버전 관리

ROS2에서는 특정 버전의 패키지에 의존성을 설정할 수 있다. 이를 통해 패키지의 호환성을 유지하고, 특정 기능을 필요로 할 때 해당 버전 이상의 패키지로 제한할 수 있다. 예를 들어, `package.xml` 파일에서 의존하는 패키지의 버전을 명시할 수 있다.

```xml
<build_depend>rclcpp>=1.0.0</build_depend>
<exec_depend>sensor_msgs>=2.0.0</exec_depend>
```

위의 예에서 `rclcpp` 패키지는 버전 1.0.0 이상, `sensor_msgs`는 버전 2.0.0 이상을 요구한다. 이를 통해 버전 충돌이나 기능 불일치를 방지할 수 있다. 하지만, ROS2의 패키지 버전 관리는 주로 전체 ROS2 배포판의 일관성을 유지하는 방식으로 관리되기 때문에, ROS2 릴리즈마다 의존성 관리가 다소 달라질 수 있다.

#### 의존성 문제 해결

의존성 문제를 해결하기 위한 일반적인 단계는 다음과 같다:

1. **의존성 누락 확인**: 패키지 의존성 파일인 `package.xml`이나 `CMakeLists.txt`에 필요한 의존성이 누락되었는지 확인한다. 예를 들어, 패키지에서 특정 메시지를 사용하는데 `sensor_msgs`와 같은 패키지 의존성이 누락되면 빌드 오류가 발생할 수 있다.
2. **패키지 검색**: 필요한 패키지가 설치되지 않은 경우, `apt`, `rosdep` 등의 도구를 사용해 설치할 수 있다. 예를 들어, ROS2의 경우 다음 명령어로 필요한 패키지를 설치할 수 있다.

```bash
sudo apt install ros-humble-sensor-msgs
```

3. **의존성 충돌 해결**: 여러 버전의 패키지가 설치되어 충돌하는 경우, 시스템에 설치된 패키지 버전을 확인하고, 불필요한 버전을 제거하거나 맞는 버전으로 업데이트한다.

```bash
sudo apt remove ros-humble-<package>
sudo apt install ros-humble-<package>
```

4. **로컬 패키지 의존성 문제**: 로컬에서 패키지를 개발하는 경우, 빌드 시스템이 패키지를 찾지 못하는 경우가 있을 수 있다. 이때는 `source` 명령어를 사용해 워크스페이스 설정 파일을 로드하거나, 패키지를 다시 빌드하여 빌드 경로를 재설정할 수 있다.

```bash
source install/setup.bash
colcon build --packages-select <package_name>
```

#### rosdep을 활용한 의존성 설치

`rosdep`은 ROS 패키지에서 의존성을 자동으로 해결하고 설치하는 도구이다. 특히 ROS2 패키지의 의존성을 설치할 때 매우 유용하게 사용된다. `rosdep`을 사용하면 `package.xml` 파일에 명시된 의존성을 자동으로 확인하고, 시스템에 설치된 패키지와 비교하여 설치되지 않은 의존 패키지를 설치할 수 있다.

```bash
rosdep install --from-paths src --ignore-src -r -y
```

위 명령어는 현재 워크스페이스의 `src` 디렉토리 안에 있는 모든 패키지의 의존성을 확인하고, 시스템에 설치되지 않은 의존 패키지를 자동으로 설치한다. `rosdep`은 ROS2 패키지의 개발 및 배포 과정에서 의존성 관리를 용이하게 한다.

#### 의존성 확인 및 업데이트

ROS2 패키지는 지속적으로 업데이트되며, 이에 따라 의존성도 업데이트가 필요할 수 있다. 패키지의 의존성을 최신 상태로 유지하기 위해, 정기적으로 패키지 업데이트를 확인하고, 필요시 업데이트해야 한다.

ROS2 패키지의 의존성을 확인하거나 업데이트할 때는 `apt` 패키지 관리자를 사용할 수 있다.

```bash
sudo apt update
sudo apt upgrade ros-humble-<package_name>
```

이러한 과정을 통해 패키지의 의존성을 최신 상태로 유지하고, 의존성 충돌을 방지할 수 있다.

#### 고급 의존성 관리

ROS2 프로젝트가 커짐에 따라, 여러 패키지 간의 의존성이 복잡해질 수 있다. 특히, 다양한 하드웨어 및 소프트웨어 환경에서 ROS2 패키지를 배포하거나 실행할 때 의존성 관리는 매우 중요하다. 이러한 경우, ROS2에서는 다양한 의존성 관리 전략을 제공한다. 예를 들어, 패키지의 플랫폼별 의존성이나 선택적 의존성 등을 설정할 수 있다.

```xml
<build_export_depend>geometry_msgs</build_export_depend>
<exec_depend condition="$ROS_DISTRO == 'humble'">sensor_msgs</exec_depend>
```

위 예제에서는 특정 ROS 배포판에서만 필요한 의존성을 조건부로 설정하고 있다. 이를 통해 ROS2 패키지가 다양한 환경에서 일관성 있게 작동하도록 보장할 수 있다.
