环境¶
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
“普通”变量(使用 define
、append
和 prepend
声明的变量)默认会用空格进行追加,但可以通过 separator
参数定义一个自定义的分隔符。
“路径”变量(使用 define_path
、append_path
和 prepend_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 生成器使用 build
和 run
作用域,但也可能管理其他作用域。
环境定义¶
还有一些其他地方可以定义和使用 Environment
:
在配方(recipe)的
package_info()
方法中,使用新的self.buildenv_info
和self.runenv_info
,此环境将分别通过VirtualBuildEnv
和VirtualRunEnv
传播给依赖于此配方的包。在需要为当前配方定义环境的生成器(generators)中,例如
AutootoolsDeps
、AutotoolsToolchain
。在配置(profiles)的
[buildenv]
部分。在配置(profiles)的
[runenv]
部分。
在 package_info()
中的定义如下,考虑到 self.buildenv_info
和 self.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” Environment。
- vars(conanfile, scope='build')¶
- 参数:
conanfile – 一个 conanfile 的实例,通常在配方中是
self
。scope – 确定声明变量的作用域。
- 返回:
从当前 Environment 对象返回一个 EnvVars 对象。
- deploy_base_folder(package_folder, deploy_folder)¶
将路径设置为相对于 deploy_folder。