EnvVars

EnvVars 是一个类,表示给定系统的环境变量实例。它从通用的 Environment 类获取。

该类被其他工具使用,例如 conan.tools.gnu autotools 助手以及 VirtualBuildEnvVirtualRunEnv 生成器。

创建环境文件

EnvVars 对象可以生成环境文件(shell, bat 或 powershell 脚本)

def generate(self):
    env1 = Environment()
    env1.define("foo", "var")
    envvars = env1.vars(self)
    envvars.save_script("my_env_file")

虽然它可能在其他方法中使用,但此功能旨在在 generate() 方法中工作。

它将自动为 Windows 系统生成 my_env_file.bat,否则生成 my_env_file.sh

可以通过使用配置 tools.env.virtualenv:powershell 来选择生成 PowerShell .ps1 脚本而不是 .bat 脚本。此配置应设置与所需的 PowerShell 可执行文件相对应的值:版本 5.1 及以下使用 powershell.exe,PowerShell 版本 7 及以上使用 pwsh。请注意,从 Conan 2.11.0 开始,将 tools.env.virtualenv:powershell 设置为 TrueFalse 已被弃用。

您还可以在 tools.env.virtualenv:powershell 配置中包含额外的参数。例如,通过将参数作为配置值的一部分包含,您可以将值设置为 powershell.exe -NoProfilepwsh -NoProfile。执行生成的 .ps1 启动器时将考虑这些参数。

此外,默认情况下,Conan 将自动把该启动器文件路径附加到一个列表中,该列表将用于创建按顺序聚合所有启动器的 conanbuild.bat|sh|ps1 文件。conanbuild.sh|bat|ps1 启动器将在执行 generate() 方法后创建。

可以使用 scope 参数(默认为 "build")来定义不同的环境文件范围,以便单独聚合它们。例如,使用 scope="run"(就像 VirtualRunEnv 生成器所做的那样),将聚合并创建 conanrun.bat|sh|ps1 脚本

def generate(self):
    env1 = Environment()
    env1.define("foo", "var")
    envvars = env1.vars(self, scope="run")
    # Will append "my_env_file" to "conanrun.bat|sh|ps1"
    envvars.save_script("my_env_file")

您还可以使用 scope=None 参数来避免将脚本附加到聚合的 conanbuild.bat|sh|ps1 文件中

env1 = Environment()
env1.define("foo", "var")
# Will not append "my_env_file" to "conanbuild.bat|sh|ps1"
envvars = env1.vars(self, scope=None)
envvars.save_script("my_env_file")

使用环境文件运行

默认情况下,在调用每个 self.run() 命令之前,将执行 conanbuild.bat|sh|ps1 启动器。这通常在 build() 方法中完成。

您可以使用 self.run()env 参数更改默认启动器

...
def build(self):
    # This will automatically wrap the "foo" command with the correct environment:
    # source my_env_file.sh && foo
    # my_env_file.bat && foo
    # powershell my_env_file.ps1 ; cmd c/ foo
    self.run("foo", env=["my_env_file"])

应用环境变量

作为运行命令的替代方案,环境可以应用于 python 环境中

from conan.tools.env import Environment

env1 = Environment()
env1.define("foo", "var")
envvars = env1.vars(self)
with envvars.apply():
   # Here os.getenv("foo") == "var"
   ...

遍历变量

您可以像这样遍历 EnvVars 对象的环境变量

env1 = Environment()
env1.append("foo", "var")
env1.append("foo", "var2")
envvars = env1.vars(self)
for name, value in envvars.items():
    assert name == "foo":
    assert value == "var var2"

在返回的值中,系统上环境变量的当前值会被替换。当变量被附加或前置时会发生这种情况。如果需要占位符而不是实际值,可以使用带有 jinja 模板语法的 variable_reference 参数,这样将返回一个带有解析模板的字符串

env1 = Environment()
env1.append("foo", "var")
envvars = env1.vars(self)
for name, value in envvars.items(variable_reference="$penv{{{name}}}""):
    assert name == "foo":
    assert value == "$penv{{foo}} var"

警告

在 Windows 中,环境变量的大小有限制,整个环境总共 32K,但特别是 PATH 变量限制为 2048 个字符。这意味着上述实用程序可能会达到此限制,例如对于所有包都贡献到 PATH 环境变量的大型依赖图。

可以通过以下方式缓解此问题

  • 将 Conan 缓存放在更靠近 C:/ 的位置,以缩短路径

  • 更好地定义哪些依赖项可以贡献到 PATH 环境变量

  • 对于运行许多共享库依赖项(带有太多 .dll 文件)之类的事情,可以使用其他机制,例如 deployers

参考

class EnvVars(conanfile, values, scope)

表示给定系统的环境变量实例。它从通用的 Environment 类获取。

get(name, default=None, variable_reference=None)

获取环境变量的值

参数:
  • name – 环境变量的名称。

  • default – 如果变量不存在,返回的值,默认为 None。

  • variable_reference – 如果指定,使用变量引用代替环境变量的现有值,其中 {name} 可用于引用变量的名称。

items(variable_reference=None)

返回 {str: str} (变量名: 值)

参数:

variable_reference – 如果指定,使用变量引用代替环境变量的现有值,其中 {name} 可用于引用变量的名称。

apply()

上下文管理器,将声明的变量应用于当前的 os.environ,并在上下文结束时恢复原始环境。

save_script(filename)

保存一个脚本文件(bat, sh, ps1),带有一个用于设置环境的启动器。如果配置 “tools.env.virtualenv:powershell” 不是空字符串,则如果是在 Windows 中,它将生成 powershell 启动器。

参数:

filename – 要生成的文件名。如果提供了扩展名,它将为该扩展名生成启动器脚本,否则将通过检查是否在 Windows 中运行(也检查子系统)来推断格式。