set_name()

动态定义 name 属性。很少需要此方法,因为唯一有意义的用例是当一个 recipe 被共享并用于使用相同的 recipe 创建不同的包时。在大多数情况下,推荐的方法是在 recipe 中定义 name = "mypkg" 属性。

此方法仅在 recipe 导出到缓存时执行,例如通过 conan createconan export 命令;以及 recipe 在本地使用时,例如通过 conan install . 命令。在所有其他情况下,包名是完全定义好的,并且不会调用 set_name(),因此不要依赖它来实现定义 self.name 值之外的任何其他功能。

如果当前包名在 name.txt 文件中定义,可以这样做:

from conan import ConanFile
from conan.tools.files import load

class Pkg(ConanFile):
    def set_name(self):
        # This will execute relatively to the current user directory (name.txt in cwd)
        self.name = load(self, "name.txt")
        # if "name.txt" is located relative to the conanfile.py better do:
        self.name = load(self, os.path.join(self.recipe_folder, "name.txt"))

包名也可以在命令行中通过 --name=xxxx 参数为某些命令定义。如果我们想优先使用命令行参数,应该这样做:

from conan import ConanFile
from conan.tools.files import load

class Pkg(ConanFile):
    def set_name(self):
        # Command line ``--name=xxxx`` will be assigned first to self.name and have priority
        self.name = self.name or load(self, "name.txt")

The set_name() 方法可以决定定义 name 的值,而无需考虑潜在的 --name=xxx 命令行参数,甚至 set_name() 可以完全忽略它。提供一个正确的 set_name() 是开发者的责任。

def set_name(self):
    # This will always assign "pkg" as name, ignoring ``--name`` command line argument
    # and without erroring or warning
    self.name = "pkg"

如果提供了命令行参数 --name=xxx,它将被初始化到 self.name 属性中,因此 set_name() 方法可以读取并使用它。

def set_name(self):
    # Takes the provided command line ``--name`` argument and creates a name appending to
    # it the ".extra" string
    self.name = self.name + ".extra"

警告

set_name() 方法是 name 属性的替代方案。不建议或不支持同时定义 name 属性和 set_name() 方法。