colcon环境变量设置-ros2
Kong Liangqian Lv6

环境变量设置

在构建包之后使用包,或者在其依赖项之上构建包,可能需要更新环境变量。对于前者,用户的最佳选择是让脚本执行环境更新,以方便使用。在后一种情况下,需要自动化流程,以便在没有用户交互的情况下按照拓扑顺序构建包。

例如,如果一个包安装了一个可执行文件,而该可执行文件应该是可以通过名称调用的,那么包含该可执行文件的目录必须是PATH环境变量的一部分。

入口

更新环境变量:

  • 在非 Windows 平台上,shell 脚本需要被source(例如 .sh、.bash、.zsh)
  • 在Windows平台上,shell 脚本需要被执行

注意:可执行文件是不可以改变当前shell的环境变量的,因此需要通过shell 脚本来改变环境变量

package-level

注意:每一个包都会被安装在install/<package_name>,除非使用colcon build --merge-install命令,在这种情况下,包会被安装在install文件夹下

对于每个构建的包,colcon生成一组包(package)级别的脚本(每个支持的shell类型对应一个):这些脚本文件使用特定于此包的信息更新环境。

colcon 有多种改变环境变量的方法

  • 所有包都有的环境变量定义方法:
    • bin下的可执行文件将该目录添加到PATH中
    • 把现有的Python库的site-packages目录添加到PYTHONPATH中,即建立的Python库,
    • 把现有的C++库项目的安装目录,添加到CMAKE_PREFIX_PATH中(由colcon-cmake提供)
  • 一些特有的环境的变量,会由自己的包通过他们自己的脚本文件进行定义。例如ament_cmake包(由colcon-ros支持)提供一个名为share//local_setup.\的文件

workspace level

在安装前缀路径的根目录下,colcon生成两种脚本:

  • local_setup.\:使用该前缀路径下安装的所有包的信息更新环境变量。并且在此workspace下的所有包都会生效,并且是按照拓扑排序的。为了确定前缀路径下所有包的拓扑顺序,colcon将一个包的所有运行依赖项存储在share/colcon-core/packages/文件中。
  • setup.\:首先调用父目录的local_setup.\文件,然后调用同级的local_setup.\< ext >文件

不同的shell

每个shell都有可能不同的语法,并支持一组不同的特性。有些环境更改(如扩展的PATH)适用于所有shell,而有些环境更改(如提供完成功能)只适用于某些shell。如果一个shell(例如bash)提供了另一个shell(例如sh)的功能和语法的超集,那么bash不必复制.sh脚本的逻辑,但可以从包级别的设置文件中调用。后一个shell称为 primary shell.

Primary shells

使用包所必需的所有环境更改都应该在带有主shell扩展的脚本中表示。主要的shell扩展是:

  • .sh: plain shell
  • .bat: Windows cmd
  • .ps1: PowerShell

避免重复值

几个环境变量存储由分隔符分隔的多个值。通常,重复的值是没有用的,只会增加长度并降低可读性。因此,shell脚本尽量避免添加重复的值。

随着此类环境变量中值的数量增加,检查给定值是否已经在集合中的成本也会增加。这极大地影响了获取/调用工作区级设置文件所需的时间,因为每次尝试更新环境变量时,都需要对集合进行分割,并将每个现有值与将要添加的值进行比较。

因此,colcon提供了另外的方法来更新环境变量

.dsv files

虽然shell脚本可以包含任意逻辑,但是从外部看它们是如何影响环境是不透明的。

大部分的脚本会有以下一项或者多项的共同操作

  • 设置一个值到已经存在的环境变量之中
  • 添加一个环境变量
  • source/call 其他的脚本文件

一个.dsv文件包含关于预期环境更改的描述性信息(而不是shell特定的逻辑)。这样一个文件的内容使用分号作为分隔符,并包含一行。第一个值是操作的类型,后面跟着特定于该操作的可变数量的参数。

下面的列表列举了受支持的类型及其参数:

  • prepend-non-duplicate;<name>;<value>: 添加一个值value到环境变量name中,这个value会被当做一个路径path,如果不是绝对路径,则会被默认添加上前缀路径。如果value为空,则会添加一个前缀路径
  • prepend-non-duplicate-if-exists;<name>;<value>: 和prepend-non-duplicate一样,但是前提是value值存在。
  • set;<name>;<value>: 设置环境变量\为\。如果该值是安装前缀中已存在的相对路径,则安装前缀将被添加到该值之前。否则,该值将按原样使用。
  • set-if-unset;<name>;<value>: 和set一样,只是这个只会在value还没有被设置的时候生效
  • source;<path>: source其他的文件。如果path不是绝对路径,则会被添加为前缀路径

每一次编译完了之后,必须重新source,才可以生效

1
source install/local.setup.bash
 Comments