从消费者添加到 conan virtualenv

Add to conan virtualenv from consumer

这是关于 virtualenv-generator of conan:

我有一个使用 self.env_info 定义环境变量的提供程序包。 这意味着当在我的消费者包中执行 conan install 时,我会收到一个方便的 activate.sh 脚本来设置我的虚拟环境。

但是我想从我的 consumer 添加一些环境变量到这个虚拟环境。 当然,我可以手动添加这些,或者编写一个简单的包装脚本,使用我的提供商提供的环境变量并自行添加一些。 这意味着创建自定义解决方案,我希望尽可能只使用柯南来处理这些事情。

基本上,我希望我的消费者提供的环境变量在我执行 conan install 后立即进入 environment.sh.env。 一个可以接受的替代方案是,如果他们在我执行 conan build

时降落在那里

我试过的一件事:

def requirements(self):
    self.env_info.FOO = "bar"

但是,如上所述 in the docs self.env_info 仅在 package_info 方法中定义。

conan 中是否有可能从消费者包扩展提供者包的环境变量?

您可以使用一个可以支持任何东西的特殊选项:ANY

https://docs.conan.io/en/latest/reference/conanfile/attributes.html#options

class FooConan(ConanFile):

    options = {"custom_env": "ANY"}
    default_options = {"custom_env": tools.get_env("MYENVVAR")}

    def package_id(self):
        del self.info.options.FOO # Doesn't affect the package ID

    def package_info(self):
        self.env_info.FOO = self.options.custom_env

上面的示例显示了一个接收自定义选项的配方,它不影响 id,用于客户环境。

无论如何,self.env_info 不应该在安装时使用,它会在构建包时被消耗掉。 virtualrunenv 能够更改您的 PATH,如果您需要 运行 打包的特定工具,这将很有用。

第二种方式,更动态,因为cpp_info是动态的,你可以直接从用户环境消费:

class FooConan(ConanFile):
    ...
    def package_info(self):
        self.env_info.FOO = tools.get_env("FOO", "waka waka")

在这种情况下,当 运行ning conan install <ref> -g virtualenv 时,environment.sh.env 将包含 FOO=waka waka 或者,如果在消费者环境中声明了 FOO,则 FOO 的值来自消费者环境

如果你想影响你的要求,使用环境变量,不要这样做!要求影响包ID,柯南选项是最好的解决方案。