📦 Biblioteca: Pacote
Gerencie módulos e carregamento de bibliotecas!
📦O que é a biblioteca de pacote?
A biblioteca de pacote controla como módulos são carregados e encontrados. Ela gerencia o caminho de busca e o carregamento de bibliotecas Sol e nativas (DLL/SO).
pacote está disponível globalmente. Não precisa importar!
Variáveis do Pacote
pacote.caminho
String com os caminhos de busca para módulos Sol (.sol).
Caminhos separados por ; com ? sendo substituído pelo nome do módulo.
-- Ver caminho atual
exiba(pacote.caminho)
-- Saída: ./?.sol;./lib/?.sol;...
-- Adicionar novo caminho
pacote.caminho = pacote.caminho .. ";./meus_modulos/?.sol"
-- Agora importe("utils") procura em:
-- ./utils.sol
-- ./lib/utils.sol
-- ./meus_modulos/utils.sol
pacote.caminho_c
String com os caminhos de busca para bibliotecas nativas (.dll no Windows, .so no Linux).
-- Verificar se existe
se obtenha_tipo(pacote.caminho_c) ~= "texto" então
pacote.caminho_c = ""
fim
-- Adicionar caminho para DLLs
pacote.caminho_c = pacote.caminho_c .. ";./libs/?.dll"
pacote.carregados
Tabela com todos os módulos já carregados. Chave = nome do módulo, valor = módulo retornado.
Verificar se um módulo já foi carregado ou forçar recarregamento.
-- Verificar se módulo está carregado
se pacote.carregados["meu_modulo"] então
exiba("Módulo já carregado!")
fim
-- Forçar recarregamento
pacote.carregados["meu_modulo"] = nulo
local m = importe("meu_modulo") -- Carrega novamente
pacote.precarga
Tabela de módulos pré-carregados. Permite registrar módulos sem arquivos físicos.
-- Registrar módulo virtual
pacote.precarga["meu_modulo"] = função()
local M = {}
função M.saudacao(nome)
retorne "Olá, " .. nome
fim
retorne M
fim
-- Agora pode importar normalmente
local meu = importe("meu_modulo")
exiba(meu.saudacao("Maria")) -- Olá, Maria
pacote.buscadores
Tabela com funções que procuram módulos. A ordem define a prioridade de busca.
preload- Busca empacote.precargaSol- Busca arquivos.solusandopacote.caminhoC- Busca bibliotecas nativas usandopacote.caminho_cC root- Busca submódulos em bibliotecas C
-- Adicionar buscador customizado
tabela.insira(pacote.buscadores, 2, função(nome)
se nome == "especial" então
retorne função()
retorne {versao = "1.0"}
fim
fim
fim)
pacote.config
String com informações de configuração do sistema, separadas por linhas.
- Separador de diretório (
\Windows,/Unix) - Separador de caminhos (
;) - Marcador de substituição (
?) - Diretório do executável
- Marcador de ignorar
Funções do Pacote
importe (nome_modulo)
Carrega e retorna um módulo. Se já carregado, retorna do cache.
nome_modulo: Texto - Nome do módulo (use.para submódulos).
O módulo carregado (geralmente uma tabela) e dados do carregador.
-- Importar biblioteca padrão
local texto = importe("texto")
local matematica = importe("matemática")
-- Importar módulo local
local utils = importe("lib.utils")
-- Importar submódulo
local json = importe("dependencias.json.parser")
pacote.carregue_biblioteca (caminho, funcao_init)
Carrega uma biblioteca nativa (DLL/SO) manualmente.
caminho: Texto - Caminho completo da biblioteca.funcao_init: Texto - Nome da função de inicialização (ex:solopen_meumodulo).
Função de inicialização ou falha, mensagem de erro, e onde falhou.
local f, erro = pacote.carregue_biblioteca("./libs/http.dll", "solopen_http")
se f então
local modulo = f() -- Inicializa o módulo
fim
se não f então
exiba("Erro:", erro)
fim
pacote.busque_caminho (nome, caminho, [separador], [separador_dir])
Busca um arquivo usando um template de caminho.
nome: Texto - Nome do módulo.caminho: Texto - Template de busca (com?).separador: Texto (opcional) - Caractere que separa partes do nome (padrão:.).separador_dir: Texto (opcional) - Separador de diretórios (padrão: sistema).
Caminho do arquivo encontrado ou nulo e mensagem de erro.
local arquivo = pacote.busque_caminho("utils", "./?.sol;./lib/?.sol")
se arquivo então
exiba("Encontrado:", arquivo)
fim
se não arquivo então
exiba("Não encontrado")
fim
Como funciona a busca de módulos
Quando você chama importe("modulo"), Sol faz:
- Verifica cache - Se
pacote.carregados["modulo"]existe, retorna ele. - Executa buscadores - Chama cada função em
pacote.buscadoresaté encontrar. - Carrega e executa - Executa o arquivo/função encontrado.
- Armazena no cache - Guarda em
pacote.carregados.
Conversão de nomes
| Nome do Módulo | Arquivo .sol | Arquivo .dll |
|---|---|---|
"utils" | ./utils.sol | ./utils.dll |
"lib.utils" | ./lib/utils.sol | ./lib/utils.dll |
"a.b.c" | ./a/b/c.sol | ./a/b/c.dll |
Criando um módulo
-- meu_modulo.sol local M = {} -- Tabela do módulo -- Funções públicas função M.saudacao(nome) retorne "Olá, " .. nome fim -- Constantes M.VERSAO = "1.0.0" -- Retornar módulo retorne M
-- Usando o módulo local meu = importe("meu_modulo") exiba(meu.saudacao("Maria")) -- "Olá, Maria" exiba(meu.VERSAO) -- "1.0.0"
Erros comuns
O módulo não foi encontrado nos caminhos configurados. Verifique
pacote.caminho.
Importação circular detectada (A importa B, B importa A). Reorganize o código.