上述方法需要修改所有配方以考虑到它。 也可以定义不兼容的设置种类,例如os = Windows和distro = CentOS。 虽然完全可以添加新设置,但是在其他情况下可能更有意义,但是对于此示例,将其添加为上述Linux OS子集就足够了:

    1. os:
    2. Windows:
    3. subsystem: [None, cygwin, msys, msys2, wsl]
    4. Linux:
    5. distro: [None, RHEL6, CentOS, Debian]

    通过此定义,我们可以将配置文件定义为:

    1. [settings]
    2. os = "Linux"
    3. os.distro = "CentOS"
    4. compiler = "gcc"

    任何为另一个os值而不是Linux定义os.distro的尝试都会引发错误。
    由于这是一个子设置,因此在声明os设置的所有配方中都会自动考虑它。 请注意,如果要保留以前创建的二进制文件,则必须将Distro = None的值设置为重要,否则,您将不得不始终定义一个特定的Distro值,并且在没有此子设置的情况下创建的二进制文件将不再可用。
    也可以从配方中访问子设置:

    1. class Pkg(ConanFile):
    2. settings = "os", "compiler", "build_type", "arch" # Note, no "distro" defined here
    3. def build(self):
    4. cmake = CMake(self)
    5. if self.settings.os == "Linux" and self.settings.os.distro == "CentOS":
    6. cmake.definitions["SOME_CENTOS_FLAG"] = "Some CentOS Value"