嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > C/C++包管理Conan教程【16】如何重用recipe中的python代码

C/C++包管理Conan教程【16】如何重用recipe中的python代码

conan recipe是基于python编写的,在一个项目当中我们如何能够利用其他包中recipe的函数,做到代码重用,提高代码质量呢?

接下来,我们首先进入到python_requires练习当中。

python_requires下有两个子目录,一个是consumer,一个是mytools,我们目标是在consumer中使用mytools编写好的函数。

先进入到mytools文件夹:

先看一下conanfile.py是怎么写的:

这里有一个mymsg函数,接收conanfile作为输入参数。

然后执行:

(conan export的作用是将recipe(conanfile.py以及相关文件)拷贝到本地缓存目录中)

conan export . user/testing

然后我们再去consumer目录检查一下文件:

在consumer的build过程中,通过定义self.python_requires["mytools"].module,然后进行mymsg的调用。

现在,让我们再执行:

conan create . user/testing

成功调用了,yes!


你可能会有个想法,那是不是可以做一个base conanfile,然后其他的conanfile都基于这个base来扩展?

如果想要这么做,首先你需要定义这个base class

from conans import ConanFile

class MyBase(object):
def source(self):
self.output.info("My cool source!")
def build(self):
self.output.info("My cool build!")
def package(self):
self.output.info("My cool package!")
def package_info(self):
self.output.info("My cool package_info!")

class PyReq(ConanFile):
name = "pyreq"
version = "0.1"

然后执行export

conan export . pyreq/0.1@user/channel

接下来在扩展的文件当中:

from conans import ConanFile

class Pkg(ConanFile):
python_requires = "pyreq/0.1@user/channel"
python_requires_extend = "pyreq.MyBase"

(或者你也可以这么定义:class Pkg(pyreq.MyBase, ConanFile))

如果还要对各个函数进行扩展,需要用到init():

class PkgTest(ConanFile):
license = "MIT"
settings = "arch", # tuple!
python_requires = "base/1.1@user/testing"
python_requires_extend = "base.MyConanfileBase"

def init(self):
base = self.python_requires["base"].module.MyConanfileBase
self.settings = base.settings + self.settings # Note, adding 2 tuples = tuple
self.license = base.license # License is overwritten