环境变量设置
在构建包之后使用包,或者在其依赖项之上构建包,可能需要更新环境变量。对于前者,用户的最佳选择是让脚本执行环境更新,以方便使用。在后一种情况下,需要自动化流程,以便在没有用户交互的情况下按照拓扑顺序构建包。
例如,如果一个包安装了一个可执行文件,而该可执行文件应该是可以通过名称调用的,那么包含该可执行文件的目录必须是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 |