Este aplicativo é uma variante despojada do projeto de manager-userManager de Sean Corfield (sincronizado a partir de sha 2a9cf63).
O Projeto de Exemplo de Exemplo original de "Usuário" de Sean e suas variantes (incluindo este), buscando desmistificar "Como construir um aplicativo da Web Clojure usando apenas bibliotecas?" .
"Composição sobre herança", "bibliotecas sobre estruturas" e "orientação de dados" aparecem com destaque no modelo mental canônico de programação do Clojure World, incluindo a programação da web. Na ausência de algumas dessas principais intuições, até desenvolvedores experientes que são novos no Clojure tendem a lutar para criar aplicativos usando bibliotecas. O coletivo "Gerenciador de Usuário" do DemoMos pretende enfrentar esse desafio específico. Eles não aspiram a ensinar as melhores práticas de desenvolvimento da web. Para esse fim, todos os exemplos de "gerenciador de usuários" são pequenos, simplificados, "Web 1.0", aplicativos de estilo.
Este projeto expande o primer "From First Principles" que escrevi em " Clojuring the Web Application Stack: Meditation One ". Eu escolhi usar o aplicativo de demonstração original de Sean como uma especificação porque:
Se nada mais, existe para coçar a própria coceira ... eu gosto de explicações barebones e adoro descer "Espere, mas por quê?" buracos e tangentes de coelho.
Veja bem, todas as outras demos do "gerente de usuário", embora simples, são construídas com bibliotecas usadas por profissionais de clojure em aplicativos da Web de produção do mundo real. Então, se as bibliotecas são um precursor da pilha da web (personalizada) (ou estrutura) ... qual seria o precursor das bibliotecas? Sem bibliotecas :)
Mantenha a mão ao gerenciador de usuários original "e minha postagem no blog, para referência lado a lado enquanto você trabalha nessa base de código.
Se alguma coisa não estiver clara ou com erro, sinta -se à vontade para abrir um problema (mas não altere a estrutura do código).
Eu o criei para ajudar o leitor a observar a peça por peça "making-of" do aplicativo. Consulte o ReadMe a partir do compromisso em questão para instruções de uso relevantes para esse ponto no desenvolvimento.
Acho que aprendemos melhor, passando progressivamente de modelos mentais aproximados de granulação grossa para a alta fidelidade. Como tal, algumas simplificações deliberadas podem irritar profissionais da web (como usar o Get to exclation). Confira nos alunos para pegar as maneiras "certas" de fazer as coisas da soma total de seus estudos, experimentos, colegas e mentores.
Ao aprender, às vezes é bom ficar inquieto;)
O que esperar, se você trabalha adiante desde o primeiro compromisso:
curl para o aplicativo. curl localhost:3000
curl -XPOST localhost:3000/some/path?q=somethingsomething
curl -XDELETE localhost:3000/foo/bar/baz
usermanager.main deve sempre ter uma maneira atual de compromisso de iniciar/interromper o processo do servidor (e/ou estado atual do aplicativo).usermanager.* Namespace, isso é uma pista.usermanager.main devem facilitar a restauração do servidor, depois de reiniciar o REPL.dev/ diretório do projeto (você pode precisar criá -lo manualmente).department e addressbook ).dev ...Como mencionei, subtraí o maior número possível de bibliotecas, sem comprometer a fidelidade ao design do projeto original. A exceção é que qualquer forma de interope host entre nosso aplicativo da web e o mundo exterior. Eu assumi soluções pré-existentes (bibliotecas) para essas necessidades (tenho que desenhar um limite em algum lugar!). Também alguns utilitários de conforto de criatura que não são centrais para o tema desta explicação de primeiros princípios.
Volte à postagem do blog para obter uma imagem melhor de onde e por que eu desenhei esse limite.
Especificamente, eu usei:
Para permanecer fiel à especificação de Sean para a API do UserManager, modelo de domínio e "lógica de negócios", eu tenho partes de sua fonte de manáger-userManager-Exemplo:
Para reforçar a idéia de compor peças móveis usando dados simples de clojure, criei meu código para usar as opções de design feitas por Sean (por exemplo, injetando o nome da visualização no contexto da solicitação, para uso posterior pela lógica de renderização HTML). Da mesma forma, para permanecer fiel à especificação do anel, todos os utilitários de anel auto-escrito e middleware seguem a especificação do anel. Substituí-los por originais fornecidos pelo anel deve ser direto.
Se você optar por escrever sua própria variante, sugiro seguir o exemplo.
Até agora, deve ser óbvio, mas vou declará-lo de qualquer maneira ... o aplicativo despojado não é de todo robusto para as demandas do mundo real, porque omite quase todas as bibliotecas usadas pelos outros exemplos de "gerente de usuário", que fazem todos os levantamentos pesados de "grau de produção" para nós. Mesmo esses aplicativos precisarão de algum trabalho realizado sobre eles (revisões de design, testes de integração, verificações de segurança etc.), se quiserem se qualificar para a implantação do mundo real.
O mesmo que o projeto de exemplo-manager de Sean.
deps.edn .tools.build para usar comandos do arquivo build.clj . Ele está incluído através do :build do arquivo deps.edn . Os projetos de clojure-cli-using usam esse arquivo build.clj por convenção, para fornecer funcionalidade padrão e personalizada de construção de projetos. Ferramentas de configuração do esqueleto do projeto normalmente generiam automaticamente esse arquivo. Eu o copiei do projeto de Sean. Clone o repo, cd nele e siga qualquer um dos métodos abaixo para experimentar o aplicativo e/ou implantá -lo. Observe que o aplicativo resultante não é adequado para implantação de produção. Sinta -se à vontade para implantá -lo, é claro, mas exponha -o à Internet pública apenas em uma instância de servidor descartável.
Execute os testes dessa maneira, a partir da raiz do projeto.
clojure -T:build test
Isso usa o alias :build para carregar o arquivo build.clj , com base no tools.build e executar a tarefa test .
Esperançosamente, os testes passam! Você deve ver algo assim:
Running tests in #{"test"}
[ Many lines of test runner log messages. ]
Ran 11 tests containing 37 assertions.
0 failures, 0 errors.
Nota sobre as mensagens de log:
Você pode executar o aplicativo em qualquer ponto do histórico de comprometimentos deste projeto. No entanto , a funcionalidade disponível corresponderá apenas o que for construído para esse comprometimento.
Inicie o aplicativo e aponte seu navegador para http: // localhost: 3000.
clojure -M -m usermanager.main
Se essa porta estiver em uso, inicie -a em uma porta diferente. Por exemplo, porta 3100:
clojure -M -m usermanager.main 3100
Iniciar repl
clj -M:dev:test
Quando o Repl começar, inicie o servidor na porta padrão (porta 3000):
user=> ( require 'usermanager.main) ; load the code
user=> ( in-ns 'usermanager.main) ; move to the namespace
usermanager.main=> ( -main ) ; or some other port (-main 8080)Aponte seu navegador para o URL apropriado http: // localhost: PortNumber.
Use os perfis dev e test ao executar o REPL, seja independente ou através do seu editor favorito.
Em seguida, avalie/aplique!
Para implantação do servidor, você normalmente deseja criar um "Uberjar" -um arquivo .jar que contém o próprio clojure e todo o código do seu aplicativo e de suas dependências, para que você possa executá -lo com o comando java -jar . (Mas, como afirmei anteriormente, este projeto não é software de produção. Portanto, implante -o apenas em ambientes de servidores descartáveis.)
O arquivo build.clj - mencionado acima - contém uma tarefa ci que:
target.jar independente clojure -T:build ci
Isso deve produzir a mesma saída que test acima, seguido de algo como:
Copying source...
Compiling usermanager.main...
Building JAR...
A pasta target será criada se não existir e incluirá uma pasta classes que contém todo o código -fonte do clojure compilado do aplicativo usermanager e todas as suas dependências, incluindo a própria Clojure:
ls target/classes/
hiccup hiccup2 public ring usermanager
Também incluirá o arquivo .jar independente que você pode executar assim:
java -jar target/usermanager/example-standalone.jar
Isso deve se comportar da mesma forma que o exemplo de execução acima.
Este arquivo JAR pode ser implantado em qualquer servidor que tenha o Java instalado e executado sem outras dependências ou arquivos externos.
Eu posso demonstrar como substituir cada peça enrolada à mão usando bibliotecas de clojure de produção.
Mas talvez você possa fazer isso com suas próprias palavras, como lição de casa auto-atribuída! :)
Compare e contraste com os outros projetos de exemplo de manágen de usuário, para pistas.
Que a fonte esteja com você!
Copyright (c) 2015-2024 Sean Corfield. Copyright (C) 2024 Aditya Athalye.
Distribuído sob a licença de fonte do Apache 2.0.