O documento apresenta o LuaRocks, o gerenciador de pacotes para módulos Lua. Em três frases, descreve que o LuaRocks permite instalar, remover e gerenciar as dependências de módulos Lua, assim como compilar módulos escritos em Lua ou C. O documento também discute a evolução do projeto LuaRocks ao longo dos últimos 5 anos.
Webinar: Utilizando o Yocto Project para automatizar o desenvolvimento em Lin...
LuaRocks - palestra Hack'n'Rio 2011
1. LuaRocks
O gerenciador de pacotes
para módulos Lua
Hisham Muhammad
h@hisham.hm
http://www.luarocks.org
2. Plano
● Rápida Introdução
● Lua? LuaRocks?
● LuaRocks
● Conhecendo a ferramenta
● Evolução do projeto
● Passeio “histórico” por esses 5 anos de LuaRocks
● Experiências sobre a evolução de um projeto de
software livre
3. Lua
● Linguagem “script” criada na PUC-Rio
● Dinâmica, extensível, bytecode+VM...
● Com algumas características peculiares
●
Minimalismo → tamanho e desempenho
● Projetada como linguagem de extensão para
embutir em outros programas
● Muito usada na indústria, especialmente jogos
● Adobe Photoshop Lightroom, Apache, nmap, Wireshark, VLC...
● Angry Birds, Company of Heroes, Civ 5, Garry's Mod, Crysis, Star
Wars Battlefront, World of Warcraft...
4. A “cara” de Lua
function process(filename, fn, ...)
local f = io.open(filename)
local rets = {}
for line in f:lines() do
rets[#rets+1] = { fn(line, …) }
end
f:close()
return rets
end
matches = process("file.txt", string.find, "foo")
for i, match in ipairs(matches) do
print(i, table.concat(match), ", ")
end
5. O que é LuaRocks
● Gerenciador de pacotes...
● similar a dpkg (apt-get), RPM, etc.
● similar a RubyGems, Python Eggs,
npm, CPAN, etc.
● ...para módulos Lua
● módulos = bibliotecas para estender a
linguagem
6. Por que LuaRocks?
(e RubyGems, Python Eggs, npm, CPAN, etc...)
Linguagens “script” costumam ter gerenciadores de
módulos próprios por dois motivos:
● muitos módulos
● CPAN: 23.866 pacotes
● Ubuntu: ~37.000 pacotes
● portabilidade
7. LuaRocks
● Tarefas de um gerenciador de módulos
● Instalar
– ...e certificar-se que Lua encontrará o módulo
● Remover
– ...e certificar-se que as coisas não explodam
● Verificar dependências
– ...ao instalar e ao remover
● Compilar
– ...porque módulos Lua podem ser escritos
em Lua ou em C (ou qualquer outra linguagem,
mas tipicamente C)
8. LuaRocks e seu “ecossistema”
Ferramentas de linha de comando
Formato de regras para empacotamento
Formato de arquivo para os pacotes
Servidor de módulos empacotados
9. Ferramentas
A parte que o usuário de um módulo vê:
~$ wget http://lua.org/ftp/lua-5.1.4.tar.gz
~$ tar zxvpf lua-5.1.4.tar.gz
~$ cd lua-5.1.4; make linux; sudo make install; cd ..
~$ wget http://luarocks.org/releases/luarocks-2.0.6.tar.gz
~$ tar zxvpf luarocks-2.0.6.tar.gz
~$ cd luarocks-2.0.6; ./configure; sudo make install; cd ..
~$ sudo luarocks install luasocket
~$ lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require "socket"
10. Comandos do luarocks
● build ● remove
para compilar para desinstalar
● install ● pack
para usar binários para gerar um pacote
● download ● path
para só baixar para configurar o ambiente
● list ● unpack
para listar os pacotes instalados para quem quer desempacotar e
mexer no conteúdo
● show
para mostrar informações de um ● make
pacote instalado para testar, no desenvolvimento
● help
sempre importante
11. Como criar um pacote
Um pacote em LuaRocks é um “rock”
Ele é criado a partir de um arquivo “rockspec”
12. Rocks
● Um rock contém módulos e o rockspec
● Pode conter os binários ou os fontes
● Arquivo com nome no formato
pacote-versao-revisao.tipo.rock:
● Exemplos: luafilesystem-1.5.0-2.src.rock,
lpeg-0.10-2.linux-x86.rock, lxsh-0.8.6-1.all.rock
● Na verdade é um arquivo .zip, com conteúdo
padronizado:
● Arquivos rockspec e rock_manifest na raiz
● Subdiretórios lua/, lib/, bin/...
13. Rockspecs
● Um rockspec um arquivo texto
com regras que indicam:
● De onde baixar os fontes
● Quais as suas dependências
● Como compilar
● Como instalar
● Na verdade é um arquivo Lua
● Um dos talentos de Lua é servir como linguagem
de descrição de dados
14. A “cara” de um rockspec
package = "LPeg"
version = "0.9-1"
source = {
url = "http://www.inf.puc-rio.br/~roberto/lpeg/lpeg-0.9.tar.gz",
md5 = "84a4f5fb4b87b90bb1b7284ec6bb69bc"
}
description = {
summary = "Parsing Expression Grammars For Lua",
detailed = [[LPeg is a new pattern-matching library for Lua...]],
homepage = "http://www.inf.puc-rio.br/~roberto/lpeg.html",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
lpeg = "lpeg.c",
re = "re.lua"
},
copy_directories = { "tests" }
}
15. Usando Lua como formato de dados
● Permite bastante expressividade, declarar
variáveis auxiliares, etc.
● O rockspec é carregado em um ambiente
especial, sem acesso aos módulos padrão de
Lua
● Você não consegue chamar io.open, os.execute
e afins em um rockspec
● O pior que você poderia fazer é um
while true do end
e congelar a ferramenta de linha de comando
16. Disponibilizando os rocks
Publicando online repositórios,
chamados de “rocks servers”
Podem ser gerenciados usando a
ferramenta de linha de comando luarocks-admin
17. Rocks server
● Um conjunto de pacotes .rock
disponíveis online é um “rocks server”
● Um conjunto de rocks instalados localmente é
chamado de “rocks tree”
● Na verdade, é só uma URL HTTP
● Pode-se usar qualquer servidor web
● Diretório contendo arquivos .rock e um arquivo
manifest
● O manifest e um index.html são gerados pelo
rodando luarocks-admin no diretório
18. Comandos do luarocks-admin
● make-manifest
para preparar um diretório para ser um repositório
● add
para adicionar pacotes a um repositório
● remove
para remover pacotes de um repositório
● refresh-cache
para atualizar a cache local de um repositório
(bom para mirrors, backups)
● help
não pode faltar
19. Repositório público do LuaRocks.org
● A maioria dos desenvolvedores nunca lida com
a gerência de um rocks server
● Módulos são disponibilizados no server público:
http://luarocks.org/repositories/rocks/
● Há também um repositório para versões
“unstable”, que baixa fontes direto do
Git/SVN/etc.:
http://luarocks.org/repositories/rocks-scm/
20. Atualmente
● LuaRocks está na versão 2.0.6
● Temos 157 projetos no repositório público
(573 rocks disponibilizados)
● É muito pouco perto dos 23.866 de Perl
● Mas já é ~4x mais do que os ~40 módulos Lua
empacotados como .deb (Debian/Ubuntu)
● Para várias plataformas, simplesmente
não havia um repositório unificado de módulos
21. Período de desenvolvimento
● 0.1: agosto 2007
● 1.0: setembro 2008
● 0.2: outubro 2007
● 0.3: dezembro 2007
● 1.0.1: março 2009
● 0.3.1: dezembro 2007
● 2.0: outubro 2009
● 0.3.2: dezembro 2007 ● 2.0.1: outubro 2009
● 0.4: janeiro 2008
● 2.0.2: abril 2010
● 0.4.1: janeiro 2008
● 0.4.2: fevereiro 2008
● 2.0.3: setembro 2010
● 0.4.3: março 2008 ● 2.0.4: dezembro 2010
● 0.5: abril 2008 – 2.0.4.1: janeiro 2010
● 0.5.1: abril 2008 ● 2.0.5: agosto 2011
● 0.5.2: maio 2008
● 2.0.6: outubro 2011
● 0.6: junho 2008
22. Gênese
● Surgiu no contexto do Projeto Kepler
http://www.keplerproject.org
● Projeto criado pela Fábrica Digital e PUC-Rio em 2004 com o
objetivo de criar uma plataforma para programação web usando
Lua
● Financiamento via parceria empresa-universidade, FINEP,
CNPq...
● Encerrado o projeto institucional, hoje os projetos de software
livre surgidos ali são mantidos por voluntários como eu
23. Fase 0.x: “release early, release often”
● 0.1: agosto 2007
● Não havia uma cultura bem
● 0.2: outubro 2007 estabelecida de módulos reusáveis
● 0.3: dezembro 2007 em Lua
● 0.3.1: dezembro 2007 ● Lua existe desde '93-'94, o sistema
● 0.3.2: dezembro 2007 de módulos só entrou em 2006
● 0.4: janeiro 2008 ● Primeiras versões serviam para
● 0.4.1: janeiro 2008 atender ao projeto Kepler
● 0.4.2: fevereiro 2008 ● Popularidade dos módulos Kepler
● 0.4.3: março 2008 alavancaram o LuaRocks
● 0.5: abril 2008 ● Com o tempo ganhamos usuários, e
● 0.5.1: abril 2008 com eles módulos e bug reports
● 0.5.2: maio 2008 ● E com os bug reports, releases
● 0.6: junho 2008
24. Fase 1.x: estabilizando
● 1.0: setembro 2008 ● Objetivos do design inicial atingidos
● 1.0.1: março 2009 ● Algumas decisões de design
● 2.0: outubro 2009 serviam bem ao Kepler, mas iam
● 2.0.1: outubro 2009 contra a preferência da maioria da
comunidade Lua
● 2.0.2: abril 2010
● 2.0.3: setembro 2010
● Alguns usuários compraram a ideia,
outros não
● 2.0.4: dezembro 2010
– 2.0.4.1: janeiro 2010
● Fim do financiamento institucional
● 2.0.5: agosto 2011 ● Deixa de ser um emprego, passa a
● 2.0.6: outubro 2011
trabalho voluntário
● E os releases rareiam
● ...mas o Lua Team enfim demonstra
interesse no LuaRocks!
25. Fase 2.x: redesign e continuidade
● 1.0: setembro 2008 ● Redesign das partes problemáticas
● 1.0.1: março 2009 ● Para entrar em sintonia com a
● 2.0: outubro 2009 comunidade e funcionar out of the
box com Lua padrão
● 2.0.1: outubro 2009
● Aceitação melhorou bastante,
● 2.0.2: abril 2010
mas ainda há alguma resistência
● 2.0.3: setembro 2010
● Base de usuários vem crescendo
● 2.0.4: dezembro 2010
– 2.0.4.1: janeiro 2010
● Parceria com a distro “Lua for
Windows”
● 2.0.5: agosto 2011
● 2.0.6: outubro 2011
● LuaRocks sendo usado em ambiente
de produção
● E com isso trabalhos freelance
aparecendo
26. O futuro
● O feedback dos usuários aponta melhorias para o
formato rockspec
● mas quebrar compatibilidade é sempre traumático
● A maior falta sentida atualmente é de um serviço web
para contribuição de módulos para o repositório
público
● atualmente os módulos são enviados via mailing list
● potencial aberto para estabelecer um novo hub para a
comunidade Lua, com a atual ausência do luaforge.net
● isto seria toda uma nova frente de trabalho
27. Algumas lições aprendidas
● Compreender o contexto da comunidade onde
o projeto se insere
● Mesmo (e principalmente!) quando se quer
“mudá-la” um pouco
● Todo projeto existe dentro de um contexto
● Experiência sentida também em projetos anteriores
(GoboLinux, htop)
● Procure entender e se encaixar esse contexto,
não para ser político, mas porque isso é necessário
para que o software seja útil
28. Programar em comunidade
● É preciso criar condições para que as pessoas possam
ajudar o projeto
● Documentação
– É chato mas é necessário
– Para usuários (manual, help) e programadores (LuaDoc)
● “Suporte”: interação em listas, bug trackers, etc.
● Escolhas de design e implementação
– LuaRocks teve seus erros e seus acertos
● Você só ganha retorno depois de formar uma massa
crítica de usuários
– Mas depois que essa barreira é quebrada, o esforço “se paga”, na
forma de bugfixes, features...