# Automação com Mason Brick

fiz com Flutter/Dart pq é o q eu + uso e na boa, é chatão ficar criando cada pasta e add cada package 1 por 1 (até tem umas formas de deixar + rápido, mas msm assim) , mas da pra fazer meio q qualquer coisa, é só tu usar a criatividade (e ter muita paciência até ficar redondinho)

> vou falar rapidinho sobre a instalação, mas meu foco vai ser no meu brick + hooks

# Instalação do Mason

tem 2 formas de fazer as instalação, a 1ª é tendo o [Flutter/Dart instalado](https://docs.flutter.dev/get-started/install), a 2ª é pelo [homebrew](https://brew.sh)

## flutter/dart pub global

no seu `terminal`, seja ele qual for, é só rodar o comando `flutter pub global activate mason_cli` q é gg

## Homebrew

no seu `terminal`, seja no macOS ou Linux, é só rodar esses comandos
```sh
brew tap felangel/mason
brew install mason 
```

# Criação

rode o comando `mason init`, esse comando vai criar o `mason.yaml`, q é o arquivo onde vão ficar salvos seus bricks, depois disso, já rola criar nossos próprios bricks

## Criação do Brick

> sugiro criar uma pasta, em algum canto, pra deixar seus bricks

1. acesse a pasta pelo seu terminal
2. rode o comando `mason make nome_do_seu_bricks`, isso vai criar uma pasta com o nome q vc deu e dentro vai ter 4 arquivos e 1 pasta
3. dentro do `brick.yaml`, é onde vc vai colocar as variáveis no [padrão "{mustache}"](http://mustache.github.io)... eu não conhecia, mas curti
4. é ali q coloca o {{nomeApp}} ou {{nomeMódulo}} por exemplo, também tem tipo umas funções, tipo {{variavel.snakeCase()}}, q seria = hello_world e assim vai
5. a principio, a pasta `__brick__`, só via ter um arquivo `HELLO.md`, só deletar e começar a montar sua estrutura/arquivos dentro dessa pasta
6. caso queira adicionar algo (em um projeto flutter) ao `main.dart` de um projeto existente, é só criar a pasta `lib` e dentro dela o `main.dart`, escrever o q quiser dentro do arquivo e gg
7. toda e qualquer parte dinâmica, tem q ter uma pergunta no `brick.yaml`, a parte dinâmica no código usando o {{mustache}} e claro, toda a sequencia de pastas e arquivos q queira substituir/add

## Criação do Hooks

> na doc, tem um aviso q os hooks só suportam `Dart` por enquanto

1. acesse 1 pasta antes do seu brick pelo seu terminal
2. rode o comando `mason new nome_do_seu_bricks --hooks `, isso vai criar uma pasta dentro do seu brick com o nome de `hooks`, 5 arquivos e 1 pasta, mas vc só vai mexer nos 2 arquivos `.dart`
3. as msm variáveis do `brick.yaml` vão funcionar no seu hook
4. o `post_gen.dart` é pra fazer coisas depois q o arquivo terminar de ser gerado, tipo add packages
5. o `pre_gen.dart` é pra fazer coisas antes (não cheguei a usar ele), mas acredito q de pra criar o app por ele, ai entra o bricks e finaliza com o hook `post_gen`
6. caso queira usar só 1 deles é só deletar o arquivo q não quer usar
7. eu basicamente so pra add packages, então o arquivo `post_gen.dart` fica com várias linhas assim `await Process.run("flutter", ["pub", "add", "flutter_modular"]);`, q no caso é o msm q vc rodar no terminar `flutter pub add flutter_modular` e assim vai

# Usando

> quando tem hooks dentro do brick, ele roda sozinho (mas tem como fazer ele não rodar, caso queira)

- `mason add nome_do_brick` (esse só funciona se o brick estiver no [BrickHub](https://brickhub.dev/search)
- `mason add nome_do_brick --git-path https://url_do_git` (vai instalar o brick do git)
- `mason add nome_do_brick --path caminho/do/brick` (pra usar localmente)
- `mason ls` (mostra os bricks q vc tiver instalado)
- `mason get` (atualiza seus bricks, lembre-se desse comando quando for usar um localmente q vc tenha feito alterações)
- `mason make nome_do_brick` (pra usar o brick, se tiver hook vai rodar antes/depois)
- `mason make nome_do_brick --no-hooks` (pra usar o brick, sem os hooks)

# Explicação

> gosto de automatizar/deixar + fácil/rápido meus trabalhos, principalmente coisas repetitivas

> leva +- 60s pra tudo ser executado (m1 air 8gb)

## meu Brick

- fiz a arquitetura q eu gosto e q + me sinto confortável, seguindo alguns padrões e talz (fique a vontade para alterar viu ?!)
- vira e mexe eu crio um projeto novo, então pq não deixar a parte inicial automática né ?! já q eu sempre uso a msm coisa... modular como base do app, sentry pros erros/perfomance, firebase remote config pros feature toggles e pra mandar urls de forma segura e assim vai

## meu Hooks

- add packages necessários pro "meu padrão" funcionar
- até poderia fazer com um comando gigante de "uma vez", mas eu ia ter q salvar ele em algum canto ou até fazer um alias, mas ai fica ruim de compartilhar (acredite, eu tentei)

# Links

## brickhub.dev

- [site](https://brickhub.dev)
- [doc](https://docs.brickhub.dev)
- `mason add struct_cplt` | [meu brick struct_cplt](https://brickhub.dev/bricks/struct_cplt/1.0.0)
- `mason add mod` | [meu brick mod](https://brickhub.dev/bricks/mod/1.0.0)

## GitHub

- [mazieri/bricks](https://github.com/mazieri/bricks)
- [bricks+hooks/struct_cplt](https://github.com/mazieri/bricks/tree/master/bricks/struct_cplt)
- [bricks/mod](https://github.com/mazieri/bricks/tree/master/bricks/mod)

## YouTube

- [struct_cplt](https://youtu.be/NQQTHMPYlzw)
- [mod](https://youtu.be/WhHJ7IBOnGM)

---

# Bom, acho q é isso, obrigado por ler !

Se eu falei alguma besteira, me corrija pf, e se tiver um tempo, se inscreva na minha newsletter e fique a vontade para se [conectar](https://www.linkedin.com/in/felipemazieri/)

> ***Como a minha classe favorita do Ragnarok, Super Aprendiz, sou um Eterno Aprendiz***
    
n5 | v0.5

