问题描述
我正在尝试创建一个依赖库的柯南包,该库具有多种可能的实现(例如 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。