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() 方法中使用。
它将自动生成一个 my_env_file.bat 文件用于 Windows 系统,或者 my_env_file.sh 文件用于其他系统。
可以通过使用配置 tools.env.virtualenv:powershell 来选择生成 PowerShell .ps1 脚本,而不是 .bat 脚本。此配置应设置为所需 PowerShell 可执行文件的值:powershell.exe 用于版本高达 5.1,以及 pwsh 用于从版本 7 开始的 PowerShell 版本。请注意,从 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 文件,以聚合所有启动器。在执行 generate() 方法之后,将创建 conanbuild.sh|bat|ps1 启动器。
可以使用 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")
使用环境变量文件运行¶
默认情况下,conanbuild.bat|sh|ps1 启动器将在调用每个 self.run() 命令之前执行。这通常在 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),其中包含一个启动器来设置环境。如果配置“tools.env.virtualenv:powershell”不是空字符串,它将在 Windows 上生成 powershell 启动器。
- 参数:
filename – 要生成的文件名。如果提供了扩展名,它将生成该扩展名的启动器脚本,否则将通过检查是否在 Windows 内部运行(也检查子系统)来推断格式。