EnvVars¶
EnvVars
是一个类,用于表示给定系统环境变量的一个实例。它从通用的 Environment 类中获取。
此类被其他工具使用,例如 conan.tools.gnu 的 autotools 辅助函数以及 VirtualBuildEnv 和 VirtualRunEnv 生成器。
创建环境变量文件¶
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 可执行文件对应的(?:),powershell.exe
(适用于 5.1 及更早版本)或 pwsh
(适用于 7 及更高版本)。请注意,自 Conan 2.11.0 起,将 tools.env.virtualenv:powershell
设置为 True
或 False
已弃用。
您还可以将其他参数包含在 tools.env.virtualenv:powershell
配置中。例如,您可以将值设置为 powershell.exe -NoProfile
或 pwsh -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")
从 Conan 2.21 开始,如果 **实验性** 的 tools.env:dotenv
配置处于活动状态,那么也将生成 .env
文件。这些文件不是用于激活为脚本,而是由 IDE 等工具加载。
您还可以使用 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} (varname: value)。
- 参数:
variable_reference – 如果指定,则使用变量引用而不是环境变量的预存值,其中 {name} 可用于引用变量的名称。
- apply()¶
上下文管理器,用于将声明的变量应用于当前的
os.environ
,并在上下文结束时恢复原始环境。
- save_script(filename)¶
保存一个脚本文件(bat、sh、ps1)和一个用于设置环境的启动器。如果 conf “tools.env.virtualenv:powershell” 不是空字符串,它将在 Windows 上生成 powershell 启动器。
- 参数:
filename – 要生成的文件名。如果提供了扩展名,它将为该扩展名生成启动器脚本,否则将通过检查我们是否在 Windows 中运行(还检查子系统)来推断格式。