使用rosdep管理依赖关系
目录
目标: 使用``rosdep``管理外部依赖项。
教程级别: 中级
时间: 5分钟
本教程将解释如何使用``rosdep``管理外部依赖项。
警告
目前,rosdep 仅在 Linux 和 macOS 上运行;不支持 Windows。有长期计划将 Windows 添加到 https://github.com/ros-infrastructure/rosdep 的支持范围内。
什么是rosdep?
rosdep
是一种依赖管理工具,可以与包和外部库一起工作。它是用于识别和安装依赖项以构建或安装包的命令行实用程序。rosdep
不是一个独立的包管理器;它是一个元包管理器,使用其对系统和依赖项的了解来查找适合在特定平台上安装的包。实际的安装是使用系统包管理器完成的(例如,在 Debian/Ubuntu 上是 apt
,在 Fedora/RHEL 上是 dnf
等)。
通常在构建工作空间之前调用它,用于安装工作空间内包的依赖项。
它具有在单个软件包或软件包目录(例如工作空间)上工作的能力。
注解
尽管名称表明它是为 ROS 设计的,但 rosdep
对 ROS 半不可知。您可以将这个强大的工具用于非 ROS 软件项目,通过将其安装为独立的 Python 包。成功运行 rosdep
依赖于 rosdep keys
是否可用,这些 keys 可以通过几个简单的命令从一个公共的 git 存储库中下载。
关于 package.xml 文件的一点说明
package.xml
是您的软件中 rosdep
查找依赖项集的文件。package.xml
中依赖项列表完整且正确非常重要,这允许所有工具确定软件包的依赖关系。缺少或不正确的依赖关系可能会导致用户无法使用您的软件包,工作空间中的软件包构建顺序不正确,或无法发布软件包。
package.xml
文件中的依赖关系通常被称为"rosdep keys"。这些依赖关系由软件包的创建者手动填充在 package.xml
文件中,应该是它所需的所有非内置库和软件包的详尽列表。
这些依赖关系在以下标签中表示(查看 REP-149 以获取完整规范):
<depend>
这些是应该在软件包的构建时间和运行时间都提供的依赖关系。对于 C++ 软件包,如果不确定,请使用此标签。纯 Python 软件包通常没有构建阶段,因此不应使用此标签,而应改用 <exec_depend>
。
<build_depend>
如果您的软件包仅在构建时使用特定的依赖项,而在执行时不需要,您可以使用 <build_depend>
标签。
对于此类依赖关系,安装的二进制文件不要求安装该特定软件包。
但是,如果您的软件包导出了一个包含此依赖项的头文件,那么在这种情况下,您还需要使用 <build_export_depend>
。
<build_export_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的拉取请求在一周内就会合并。
关于如何贡献新的rosdep键,可以在此处找到详细说明:<https://github.com/ros/rosdistro/blob/master/CONTRIBUTING.md#rosdep-rules-contributions>。如果由于某些原因无法公开贡献,也可以fork rosdistro并维护一个备用索引供使用。
如何使用rosdep工具?
rosdep 安装
如果您正在使用 ROS,可以方便地将 rosdep
与 ROS 发行版一起打包安装。这是获取 rosdep
的推荐方法。您可以使用以下命令进行安装:
apt-get install python3-rosdep
注解
在 Debian 和 Ubuntu 上,还有一个名字类似的软件包叫做 python3-rosdep2
。如果已安装该软件包,请确保在安装 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 install``来安装依赖项。通常,我们会在一个工作空间上运行此命令,通过单个调用安装所有依赖项。如果在包含源代码的``src``目录下的工作空间根目录运行该命令,命令如下所示:
rosdep install --from-paths src -y --ignore-src
对此进行解释:
``--from-paths src``指定要检查以解析键的``package.xml``文件的路径
``-y``表示在包管理器的提示中默认全部回答为“是”,无需提示即可安装
--ignore-src
表示忽略安装依赖项,即使存在 rosdep 键,也会忽略,如果包本身也在工作空间中。
还有其他可用的参数和选项。使用 rosdep -h
查看它们,或查看 rosdep 的更完整文档,网址是 http://docs.ros.org/en/independent/api/rosdep/html/ 。
- 1
“在 ROS 生态系统中发布” 意味着该软件包在 rosdistro 数据库 中的一个或多个
<distro>/distribution.yaml
目录中列出。