环境¶
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 声明的变量)将使用默认的系统路径分隔符附加,即 : 或 ;,但它也允许定义使用哪一个。
环境文件生成¶
可以通过 EnvVars 类间接完成环境脚本文件(如 envfile.bat|.sh|.ps1|.env)的生成,该类可以使用以下方式获得
from conan.tools.env import Environment
env1 = Environment()
...
envvars = env1.vars(self) # An EnvVars object
# Generate a .bat|.sh|.ps1|.env file depending on current
# settings and Conan configuration
envars.save_script("mybuild")
# or decide to be explicit and generate some of the files:
envvars.save_dotenv("myenv.env")
这些文件也可以由后续的 self.run() 调用自动使用。 有关更多信息,请参阅 EnvVars 类的文档。
组合¶
环境可以组合
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
在配方的
package_info()方法中,在新的self.buildenv_info和self.runenv_info中,此环境将通过VirtualBuildEnv和VirtualRunEnv分别传播到依赖此配方的包。在需要定义当前配方环境的
AutootoolsDeps、AutotoolsToolchain等生成器中。在配置文件的
[buildenv]部分。在配置文件的
[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=' ')¶
定义名为 name 的环境变量,其值为 value
- 参数:
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 的实例,通常是配方中的
selfscope – 确定声明变量的范围。
- 返回:
来自当前 Environment 对象的 EnvVars 对象
- deploy_base_folder(package_folder, deploy_folder)¶
使路径相对于 deploy_folder