【问题标题】:Add to conan virtualenv from consumer从消费者添加到 conan virtualenv
【发布时间】:2020-07-18 04:32:01
【问题描述】:

这是关于 conanvirtualenv 生成器:

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

但是我想从我的消费者向这个虚拟环境添加一些环境变量。 当然,我可以手动添加这些,或者编写一个简单的包装脚本,使用我的提供者提供的环境变量并自己添加一些。 不过,这意味着创建自定义解决方案,并且我希望尽可能只将柯南用于这些事情。

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

时降落在那里

我尝试过的一件事:

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

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

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

【问题讨论】:

    标签: conan


    【解决方案1】:

    您可以使用可以支持任何内容的特殊选项: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")
    

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

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

    【讨论】:

    • 我明白为什么你会认为我想影响需求——事实并非如此。我把它放在requirements-方法中只是因为我确信这个方法会在安装时被调用。我喜欢您发布的两种方式,但有一个很大的警告:在我的情况下,提供者不知道消费者必须设置的环境变量的键。据我所知,您的两个解决方案都假设您了解密钥。好吧,但如果 Any 被理解为“任何 python 对象”,我想我可以从你的第一种方式构建一些东西,提供键值对......
    • 如果有一种方法不需要对提供者进行修改,我仍然会很高兴听到它!
    • 好的,我不能使用选项,因为它们被认为需要对二进制文件进行更改,并且我正在打包一个现有的二进制文件,以便在安装时不重新构建..
    • 您可以从包 id 中删除任何选项,所以这不是问题:docs.conan.io/en/latest/creating_packages/… 我要更新我的原始答案
    • 如果有人偶然发现了这个问题,这是我向 conan.io 提出的feature-request 的问题。根据您阅读此主题的时间,可能会有更自然的解决方案..
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多