柯南在 requires 中寻找替代库

问题描述

我正在尝试创建一个依赖库的柯南包,该库具有多种可能的实现(例如 openssl 与boringssl 或 OpenBlas 与 BlasLapack)

问题是我不明白如何用柯南写这个:

def requirements(self):
    self.requires("openssl/[>=x.y.z]")
    or # <= this is what I'm trying to do
    self.requires("boringssl/[>=x.y.z]")

是否可能在最重要的地方,如果是,如何?

解决方法

是的,完全有可能。

实际上我们有关于官方食谱Conan Center Index的真实例子。

让我们看看 usockets 食谱:

import React,{ useEffect,useState } from 'react'
import { ErrorMessage,Formik,Form,Field } from 'formik';
import * as yup from 'yup'

import { Redirect } from 'react-router-dom';

import api from '../../services/Api';

import Navbar from '../../components/NavBar'
import Footer from '../../components/Footer'
import './styles2.css' 
import { render } from '@testing-library/react';

const Register: React.FC = () => {

    const [created,setCreated] = useState("");
    const [notCreated,setNotCreated] = useState("");
    const [errorEmail,setErroremail] = useState("");


    const validations = yup.object().shape({
        name: yup.string().required("*Campo necessário").min(5),email: yup.string().email("*Email inválido").min(3,"Email não é grande o suficiente").required("*Campo necessário"),number: yup.string().required("*Campo necessário").min(11,"Número inválido"),password: yup.string().required("*Campo necessário").min(8,"*Senha deve ter no mínimo 8 caracteres"),role: yup.string().required("*Campo necessário"),interactian_code: yup.string().required("*Campo necessário"),repeat_password: yup.string().required("*Campo necessário").oneOf([yup.ref('password'),null],'Senhas não conferem')
    });

    useEffect(() => {

    },[created])

    useEffect(() => {

    },[errorEmail]);
    


    return (

        <>
            <Navbar />
            <div className="flex-box1 container-box1">
                <Formik initialValues={{}} onSubmit={async (values:any)=>{
                    {
                        const response = await api.post('/interactians',{
                            headers:{
                                content_type: "application/json"
                            },name: values.name,email: values.email,tel: values.number,password: values.password,interactian_code: values.interactian_code,role: values.role
                        }).then((res) => {
                            console.log(res.status);
                            if(res.status === 201){
                                setErroremail("");
                                setCreated("Usuário criado com sucesso!");
                                setTimeout(()=>{
                                    render(
                                        <Redirect to="/"/>
                                    )
                                },2000)
                            }else{
                                setNotCreated("")
                            }
                
                        }).catch((error)=>{
                            console.log(`Esse é o erro -----> ${error.status}`)
                
                            switch(error.message){
                                case "Request failed with status code 406":
                                    setErroremail("*Email em uso!");
                                        break;
                            }
                        })
                
                        console.log(response)
                
                    }
                    }
                } validationSchema={validations}>
                    <Form className="content-box1">
                            <h1 className="color">Criar Conta</h1>
                            <h4 className="color">Começar com conta existente</h4>
                            <button className="logue-fc">Logue com Facebook</button>
                            <br></br>
                            <button className="logue-gg">Logue com Twitter</button>
                            <br></br>
                            <b>
                                <p className="ou">OU</p>
                            </b>

                        <Field className="caixas" name="name" type="text" placeholder="Nome completo"/>
                        <ErrorMessage name="name" render={(e) => <span className="caixas-error">{e}</span> }/>
                            <span>{errorEmail}</span>
                        <Field className="caixas" name="email" type="email" placeholder="Email"/>
                        <ErrorMessage name="email" render={(e) => <span className="caixas-error">{e}</span> }/>

                        <Field className="caixas" name="number"  type="text" placeholder="Número de celular"/>
                        <ErrorMessage name="number" render={(e) => <span className="caixas-error">{e}</span> }/>

                        <Field className="caixas" as="select" name="role">
                            <option value="presidente">Presidente</option>
                            <option value="diretor_de_projetos">Diretor de Projetos</option>
                            <option value="diretor_de_serviços_internos">Diretor de Serviços Internos</option>
                            <option value="diretor_de_imagem_pública">Diretor de Imagem Pública</option>
                            <option value="administrador_do_site">Administrador do site</option>
                            <option value="rotariano_patrocinador">Rotariano patrocinador</option>
                            <option value="associado">Associado</option>

                        </Field>
                        <ErrorMessage name="role" render={(e) => <span className="caixas-error">{e}</span> }/>

                        <Field className="caixas" name="interactian_code" type="password" placeholder="Código Interactiano"/>
                        <ErrorMessage name="interactian_code" render={(e) => <span className="caixas-error">{e}</span> }/>
                    

                        <Field className="caixas" name="password" type="password" placeholder="Senha"/>
                        <ErrorMessage name="password" render={(e) => <span className="caixas-error">{e}</span> }/>

                        <Field className="caixas" name="repeat_password" type="password" placeholder="Confirmar senha"/>
                        <ErrorMessage name="repeat_password" render={(e) => <span className="caixas-error">{e}</span> }/>

                        <button type="submit" className="btnesse">
                            Cadastrar
                        </button>
                        <h1 className="created-message">{created}</h1>
                        <h1 className="not-created-message">{notCreated}</h1>

                    </Form>
                </Formik>

            </div>

            <Footer />
        </>
    )
}

export default Register


如您所见,我们可以使用 options 来确定要使用的需求。

因此,如果我们运行 class ConanUSockets(ConanFile): ... options = {"with_ssl": [False,"openssl","wolfssl"],...} default_options = {"with_ssl": False} ... def requirements(self): if self.options.with_ssl == "openssl": self.requires("openssl/1.1.1g") elif self.options.with_ssl == "wolfssl": self.requires("wolfssl/4.4.0") ,它将根据要求安装 OpenSSL。