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