环境

Environment 是一个通用类,用于帮助定义对环境变量的修改。 此类被其他工具使用,例如 conan.tools.gnu Autotools 助手和 VirtualBuildEnv 以及 VirtualRunEnv 生成器。 重要的是要强调这是一个通用类,要能够使用它,需要针对当前上下文(shell 脚本、bat 文件、路径分隔符等)进行专门化,需要从中获得一个 EnvVars 对象。

变量声明

from conan.tools.env import Environment

def generate(self):
    env = Environment()
    env.define("MYVAR1", "MyValue1")  # Overwrite previously existing MYVAR1 with new value
    env.append("MYVAR2", "MyValue2")  # Append to existing MYVAR2 the new value
    env.prepend("MYVAR3", "MyValue3") # Prepend to existing MYVAR3 the new value
    env.remove("MYVAR3", "MyValue3")  # Remove the MyValue3 from MYVAR3
    env.unset("MYVAR4")               # Remove MYVAR4 definition from environment

    # And the equivalent with paths
    env.define_path("MYPATH1", "path/one")  # Overwrite previously existing MYPATH1 with new value
    env.append_path("MYPATH2", "path/two")  # Append to existing MYPATH2 the new value
    env.prepend_path("MYPATH3", "path/three") # Prepend to existing MYPATH3 the new value

“普通”变量(使用 defineappendprepend 声明的变量)默认将附加一个空格,但可以提供 separator 参数来定义自定义的空格。

“路径”变量(使用 define_pathappend_pathprepend_path 声明的变量)将附加默认的系统路径分隔符,即 :;,但也允许定义使用哪一个。

组成

环境可以组成

from conan.tools.env import Environment

env1 = Environment()
env1.define(...)
env2 = Environment()
env2.append(...)

env1.compose_env(env2) # env1 has priority, and its modifications will prevail

获取环境变量

您可以使用 vars() 方法获取 EnvVars 对象,如下所示

from conan.tools.env import Environment

def generate(self):
    env = Environment()
    env.define("MYVAR1", "MyValue1")
    envvars = env.vars(self, scope="build")
    # use the envvars object

默认的 scope 等于 "build",这意味着如果此 envvars 生成一个脚本来激活变量,则该脚本将自动添加到 conanbuild.sh|bat 中,以方便用户和配方。 Conan 生成器使用 buildrun 作用域,但也有可能管理其他作用域。

环境定义

还有其他一些地方可以定义和使用 Environment

  • 在配方的 package_info() 方法中,在新的 self.buildenv_infoself.runenv_info 中,此环境将分别通过 VirtualBuildEnvVirtualRunEnv 传播到依赖于此配方的包。

  • 在生成器中,例如 AutootoolsDepsAutotoolsToolchain,它们需要为当前配方定义环境。

  • 在配置文件的 [buildenv] 部分中。

  • 在配置文件的 [runenv] 部分中。

package_info() 中的定义如下,考虑到 self.buildenv_infoself.runenv_info 都是 Environment() 类的对象。

from conan import ConanFile

class App(ConanFile):
    name = "mypkg"
    version = "1.0"
    settings = "os", "arch", "compiler", "build_type"

    def package_info(self):
        # This is information needed by consumers to build using this package
        self.buildenv_info.append("MYVAR", "MyValue")
        self.buildenv_info.prepend_path("MYPATH", "some/path/folder")

        # This is information needed by consumers to run apps that depends on this package
        # at runtime
        self.runenv_info.define("MYPKG_DATA_DIR", os.path.join(self.package_folder,
                                                               "datadir"))

参考

class Environment

通用类,用于帮助定义对环境变量的修改。

dumps()
返回:

一个字符串,包含类似配置文件的原始定义,而不是完整的环境值

define(name, value, separator=' ')

使用值 value 定义 name 环境变量

参数:
  • name – 变量的名称

  • value – 环境变量将采用的值

  • separator – 用于分隔附加或前置值的字符

unset(name)

清除变量,相当于 unset 或 set XXX=

参数:

name – 要取消设置的变量的名称

append(name, value, separator=None)

value 附加到环境变量 name

参数:
  • name – 要附加新值的变量的名称

  • value – 新值

  • separator – 用于分隔附加值与先前值的字符。 默认情况下,它将使用一个空格。

append_path(name, value)

类似于“append”方法,但表明该变量是文件系统路径。 它将根据操作系统自动处理路径分隔符。

参数:
  • name – 要附加新值的变量的名称

  • value – 新值

prepend(name, value, separator=None)

value 前置到环境变量 name

参数:
  • name – 要前置新值的变量的名称

  • value – 新值

  • separator – 用于分隔前置值与先前值的字符

prepend_path(name, value)

类似于“prepend”方法,但表明该变量是文件系统路径。 它将根据操作系统自动处理路径分隔符。

参数:
  • name – 要前置新值的变量的名称

  • value – 新值

remove(name, value)

从变量 name 中删除 value

参数:
  • name – 变量的名称

  • value – 要删除的值。

compose_env(other)

将一个 Environment 对象与另一个对象组合。 self 具有优先权,“other” 将在可能且不冲突的情况下添加/附加,但 self 决定要做什么。 如果 self 具有没有占位符的 define(),则它将保持不变。

参数:

other (class:Environment) – “other” 环境

vars(conanfile, scope='build')
参数:
  • conanfile – conanfile 的实例,通常是配方中的 self

  • scope – 确定声明的变量的作用域。

返回:

来自当前 Environment 对象的 EnvVars 对象

deploy_base_folder(package_folder, deploy_folder)

使路径相对于 deploy_folder