使用 rosdep 管理依赖关系
目标: 使用“rosdep”管理外部依赖项。
教程级别: 中级
时间: 5 分钟
本教程将解释如何使用“rosdep”管理外部依赖项。
Warning
Currently rosdep only works on Linux and macOS; Windows is not supported. There are long-term plans to add support for Windows to https://github.com/ros-infrastructure/rosdep.
What is rosdep?
rosdep
是一个依赖管理实用程序,可以与包和外部库一起使用。
它是一个命令行实用程序,用于识别和安装依赖项以构建或安装包。
rosdep
本身并不是一个包管理器;它是一个元包管理器,它使用自己对系统和依赖项的了解来查找要在特定平台上安装的适当包。
实际安装是使用系统包管理器完成的(例如 Debian/Ubuntu 上的 apt
、Fedora/RHEL 上的 dnf
等)。
它通常在构建工作区之前调用,用于安装该工作区内包的依赖项。
它能够对单个包或包目录(例如工作区)进行操作。
Note
虽然名称表明它是为 ROS 设计的,但“rosdep”与 ROS 半无关。 您可以通过将其安装为独立的 Python 包,在非 ROS 软件项目中使用这个强大的工具。 成功运行“rosdep”依赖于“rosdep keys”的可用性,可以使用几个简单的命令从公共 git 存储库下载。
关于 package.xml 文件的一些信息
package.xml
是软件中 rosdep
查找依赖项集的文件。
package.xml
中的依赖项列表完整且正确非常重要,这允许所有工具确定包依赖项。
缺少或不正确的依赖项可能导致用户无法使用您的包、工作区中的包构建顺序混乱以及包无法发布。
package.xml
文件中的依赖项通常称为“rosdep 键”。
这些依赖项由包的创建者手动填充在 package.xml
文件中,应该是它所需的任何非内置库和包的详尽列表。
这些在以下标记中表示(有关完整规范,请参阅 REP-149):
<depend>
这些是应该在构建时和运行时为您的包提供的依赖项。 对于 C++ 包,如果有疑问,请使用此标签。 纯 Python 包通常没有构建阶段,因此永远不应使用此阶段,而应改用“<exec_depend>”。
<build_depend>
如果您只使用特定依赖项来构建包,而不是在执行时使用,则可以使用 <build_depend>
标记。
有了这种类型的依赖项,包的已安装二进制文件不需要安装该特定包。
但是,如果您的包导出的标头包含来自此依赖项的标头,则可能会产生问题。
在这种情况下,您还需要 <build_export_depend>
。
<build_export_depend>
如果您导出包含依赖项标头的标头,则其他“<build_depend>”上的包将需要它。 这主要适用于标头和 CMake 配置文件。 您导出的库引用的库包通常应指定“<depend>”,因为它们在执行时也是需要的。
<exec_depend>
此标签声明运行包时所需的共享库、可执行文件、Python 模块、启动脚本和其他文件的依赖项。
<test_depend>
此标记声明仅测试所需的依赖项。 此处的依赖项不应与“<build_depend>”、“<exec_depend>”或“<depend>”指定的键重复。
rosdep 如何工作?
rosdep
将检查其路径或特定包中的 package.xml
文件,并查找存储在其中的 rosdep 键。
然后将这些键与中央索引进行交叉引用,以在各种包管理器中找到适当的 ROS 包或软件库。
最后,一旦找到包,它们就会安装并准备就绪!
rosdep
的工作原理是将中央索引检索到本地机器上,这样它就不必在每次运行时访问网络(在 Debian/Ubuntu 上,它的配置存储在 /etc/ros/rosdep/sources.list.d/20-default.list
中)。
中央索引称为 rosdistro
,可以在线找到 <https://github.com/ros/rosdistro>`_。
我们将在下一节中进一步探讨这一点。
我如何知道在我的 package.xml 中放入哪些键?
好问题,很高兴您问到这个问题!
如果您希望在软件包中依赖的软件包是基于 ROS 的,并且已发布到 ROS 生态系统 [1],例如
nav2_bt_navigator
,您可以简单地使用该软件包的名称。您可以在 https://github.com/ros/rosdistro 的<distro>/distribution.yaml``(例如 ``humble/distribution.yaml
)中找到针对您给定的 ROS 发行版的所有已发布 ROS 软件包的列表。如果您希望依赖非 ROS 软件包(通常称为“系统依赖项”),则需要找到特定库的密钥。一般来说,有两个文件值得关注:
rosdep/base.yaml 包含
apt
系统依赖项rosdep/python.yaml 包含 Python 依赖项
要查找密钥,请在这些文件中搜索您的库并找到名称。 这是放入“package.xml”文件中的密钥。
例如,假设一个包依赖于“doxygen”,因为它是一个很棒的软件,并且注重文档质量(提示)。 我们会在“rosdep/base.yaml”中搜索“doxygen”,并找到:
doxygen:
arch: [doxygen]
debian: [doxygen]
fedora: [doxygen]
freebsd: [doxygen]
gentoo: [app-doc/doxygen]
macports: [doxygen]
nixos: [doxygen]
openembedded: [doxygen@meta-oe]
opensuse: [doxygen]
rhel: [doxygen]
ubuntu: [doxygen]
这意味着我们的 rosdep 密钥是“doxygen”,它将解析为不同操作系统的包管理器中的各种名称以进行安装。
如果我的库不在 rosdistro 中怎么办?
如果您的库不在“rosdistro”中,您可以体验开源软件开发的伟大之处:您可以自己添加它! rosdistro 的拉取请求通常会在一周内合并。
“详细说明可在此处找到<https://github.com/ros/rosdistro/blob/master/CONTRIBUTING.md#rosdep-rules-contributions>”以了解如何贡献新的 rosdep 密钥。
如果由于某种原因这些可能无法公开贡献,则可以分叉 rosdistro 并维护备用索引以供使用。
如何使用 rosdep 工具?
rosdep 安装
如果您在 ROS 中使用“rosdep”,它会很方便地与 ROS 发行版一起打包。 这是获取“rosdep”的推荐方法。 您可以使用以下命令安装它:
apt-get install python3-rosdep
Note
On Debian and Ubuntu, there is another, similarly named package called python3-rosdep2
.
If that package is installed, make sure to remove it before installing python3-rosdep
.
如果你在 ROS 之外使用“rosdep”,系统包可能不可用。 在这种情况下,你可以直接从 https://pypi.org 安装它:
pip install rosdep
rosdep 操作
现在我们对 rosdep
、package.xml
和 rosdistro
有了一些了解,我们就可以开始使用该实用程序了!
首先,如果这是第一次使用 rosdep
,则必须通过以下方式初始化它:
sudo rosdep init
rosdep update
这将初始化 rosdep,并且“update”将更新本地缓存的 rosdistro 索引。 偶尔“update”rosdep 以获取最新索引是个好主意。
最后,我们可以运行“rosdep install”来安装依赖项。 通常,这会在包含许多包的工作区中运行,只需一次调用即可安装所有依赖项。 如果在工作区的根目录中,目录“src”包含源代码,则该调用将显示如下。
rosdep install --from-paths src -y --ignore-src
分解如下:
--from-paths src
指定要检查的package.xml
文件路径,以解析其密钥-y
表示默认所有来自包管理器的提示均为是,无需提示即可安装--ignore-src
表示忽略安装依赖项,即使存在 rosdep 密钥,如果包本身也在工作区中。
还有其他可用的参数和选项。
使用 rosdep -h
查看它们,或查看 http://docs.ros.org/en/independent/api/rosdep/html/ 上有关 rosdep 的更完整文档。