Este projeto visa construir um ambiente de desenvolvimento em um contêiner Docker. As ferramentas utilizadas no ambiente também são utilizadas no dia a dia do autor do projeto.
Dockerized.Dev.Environment.demonstration.mp4
Neovim | Lazygit | Exa |
---|---|---|
Bat | Dust | Atuin |
Zellij | Autocomplete | Code actions |
LSP | ||
O ambiente utiliza o fish
como o shell padrão.
- NodeJS
- NPM
Git
asdf
- Elixir
- Erlang
Neovim
- Docker
- Docker Compose
- Alguma Nerd Font
-
Clone o repositório em sua máquina.
-
Adicione a função abaixo no arquivo de configuração de seu shell.
Fish
function devE # Repository path set repo_path "$HOME/< The path where the repository was cloned, without '/' at the end. Example: Documents/GitHub >" # Generating env file rm $HOME/.dev-environment.env >> /dev/null touch $HOME/.dev-environment.env ## Adding the current working directory echo "PWD = $(pwd)" >> $HOME/.dev-environment.env ## Adding host's home path echo "HOST_HOME_DIR = $HOME" >> $HOME/.dev-environment.env # Generating .gitconfig file set git_username (git config user.name) set git_email (git config user.email) set content " [user] name = $git_username email = $git_email [safe] directory = * [core] editor = nvim " rm $repo_path/dockerized-dev-environment/.gitconfig >> /dev/null touch $repo_path/dockerized-dev-environment/.gitconfig echo $content >> $repo_path/dockerized-dev-environment/.gitconfig # Commands switch $argv[1] case "run" set_color yellow printf "Starting Docker daemon...\n" set_color normal sudo systemctl start docker set_color yellow printf "Running the container...\n" set_color normal sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml --env-file $HOME/.dev-environment.env up -d --force-recreate sudo docker exec -it -w /home/ dockerized-dev-environment fish case "build" set_color yellow printf "Starting Docker daemon...\n" set_color normal sudo systemctl start docker set_color yellow printf "Building the container...\n" set_color normal sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml --env-file $HOME/.dev-environment.env up -d --build --force-recreate set_color yellow printf "Running the container...\n" set_color normal sudo docker exec -it -w /home/ dockerized-dev-environment fish case "stop" set_color yellow printf "Stopping the container...\n" set_color normal sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml stop set_color yellow printf "Stopping Docker daemon...\n" set_color normal sudo systemctl stop docker case "remove" set_color yellow printf "Removing the container and the image...\n" set_color normal sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml down --rmi all set_color yellow printf "Stopping Docker daemon...\n" set_color normal sudo systemctl stop docker case "*" printf "Usage:\tdevE COMMAND\n\n" printf "A development environment inside a Docker container\n\n" printf "Commands:\n" printf " run\t\tRun the environment and bind the current working directory with container's home directory\n" printf " build\t\tForce the build of the container\n" printf " stop\t\tStop the container and the Docker's daemon\n" printf " remove\tRemove the container, the image and stops the Docker's daemon\n" end end
Bash
devE(){ # Colors bright_yellow="\u001b[33;1m" normal="\u001b[0m" # Repository path repo_path="$HOME/< The path where the repository was cloned, without '/' at the end. Example: Documents/GitHub >" # Generating env file rm $HOME/.dev-environment.env >> /dev/null touch $HOME/.dev-environment.env ## Adding the current working directory echo "PWD = $(pwd)" >> $HOME/.dev-environment.env ## Adding host's home path echo "HOST_HOME_DIR = $HOME" >> $HOME/.dev-environment.env # Generating .gitconfig file git_username=$(git config user.name) git_email=$(git config user.name) content=" [user] name = ${git_username} email = ${git_email} [safe] directory = * [core] editor = nvim " rm $repo_path/dockerized-dev-environment/.gitconfig >> /dev/null touch $repo_path/dockerized-dev-environment/.gitconfig echo $content >> $repo_path/dockerized-dev-environment/.gitconfig # Commands case "$1" in "run") printf "${bright_yellow}Starting Docker daemon...\n${normal}" sudo systemctl start docker printf "${bright_yellow}Running the container...\n${normal}" sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml --env-file $HOME/.dev-environment.env up -d --force-recreate sudo docker exec -it -w /home/ dockerized-dev-environment fish ;; "build") printf "${bright_yellow}Starting Docker daemon...\n${normal}" sudo systemctl start docker printf "${bright_yellow}Building the container...\n${normal}" sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml --env-file $HOME/.dev-environment.env up -d --build --force-recreate printf "${bright_yellow}Running the container...\n${normal}" sudo docker exec -it -w /home/ dockerized-dev-environment fish ;; "stop") printf "${bright_yellow}Stopping the container...\n${normal}" sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml stop printf "${bright_yellow}Stopping Docker daemon...\n${normal}" sudo systemctl stop docker ;; "remove") printf "${bright_yellow}Removing the container and the image...\n${normal}" sudo docker-compose -f $repo_path/dockerized-dev-environment/docker-compose.yml down --rmi all printf "${bright_yellow}Stopping Docker daemon...\n${normal}" sudo systemctl stop docker ;; *) printf "Usage:\tdevE COMMAND\n\n" printf "A development environment inside a Docker container\n\n" printf "Commands:\n" printf " run\t\tRun the environment and bind the current working directory with container's home directory\n" printf " build\t\tForce the build of the container\n" printf " stop\t\tStop the container and the Docker's daemon\n" printf " remove\tRemove the container, the image and stops the Docker's daemon\n" ;; esac }
OBS: Se não houver username e email configurados globalmente no git, você deve preencher esses campos no arquivo
.gitconfig
.OBS: Feche o terminal para aplicar as modificações feitas no arquivo de configuração do shell.
-
Substitua
< Caminho onde o repositório foi clonado, sem '/' no final. Exemplo: Documents/GitHub >
pelo caminho do repositório. -
Execute
devE build
dentro do diretório desejado para construir o ambiente. Este comando irá vincular o diretório do host com o diretório/home/
dentro do contêiner.OBS:
devE build
precisa ser executado apenas uma vez, ou quando for necessário forçar a construção do contêiner. Caso contrário, utilizedevE run
. -
Dentro do ambiente, execute
setup
para configurá-lo.OBS:
setup
precisa ser executado apenas uma vez, ou quando for necessário reconfigurar o ambiente.
A sintaxe básica é:
devE COMMAND
E os comandos disponíveis são:
run
- Executa o ambiente e vincula o diretório de trabalho atual com o diretório home do contêiner.
build
- Força o processo de build do contêiner.
stop
- Para o contêiner e o daemon do Docker.
remove
- Remove o contêiner, a imagem e para o daemon do Docker.
Para sair do ambiente, execute exit
na linha de comando.
Nesta seção, você poderá encontrar todos os atalhos customizados utilizados no Neovim. A tecla leader
é a barra de espaço.
Buscar arquivos utilizando o telescope - leader + f + f
Buscar arquivos abertos recentemente usando o telescope - leader + f + r
Buscar uma palavra dentro de um arquivo usando o telescope - leader + f + w
Fixar a aba atual - leader + t + f
Fechar a aba atual - leader + t + x
Mover para a aba anterior - leader + t + p
Mover para a próxima aba - leader + t + n
Mostrar/Esconder a neo-tree - leader + n + t
Focar na neo-tree - leader + n + f
Resetar hunk sob o cursor - leader + h + r
Visualizar hunk sob o cursor - leader + h + p
Mostrar/Esconder o git blame - leader + h + b
Executar o Lazygit - leader + l + r
Mostrar/Esconder o trouble - leader + d + t
Mostrar diagnósticos para o buffer atual - leader + b + d
Formatar o buffer atual - leader + b + f
Mostrar ações de código para a linha abaixo do cursor - leader + b + a
Os servidores LSP presentes e configurados são:
elixirls
enextls
para a linguagem de programação Elixir.tsserver
para as linguagens de programação: JavaSccript e Typescript.lua_ls
para a linguagem de programação Lua.css_variables
ecssls
para CSS.dockerls
para os arquivos Dockerfile.
Para adicionar um novo servidor LSP, abra o Neovim e utilize o plugin Mason.
Para configurar o servidor LSP, verifique os servidores disponíveis e suas configurações na página Configuração dos Servidores e cole a configuração dentro do arquivo .config/nvim/lua/plugins/LSP/nvim-lspconfig.lua
.
Autocomplete está disponível apenas para as linguagens ou tipos de arquivo com um servidor LSP instalado e configurado.
Para adicionar autocomplete para uma linguagem de programação ou tipo de arquivo sem configurar um servidor LSP, veja a página de Servidores do plugin None-ls e cole a configuração no arquivo .config/nvim/lua/plugins/LSP/none-ls.lua
.
As ferramentas de diagnóstico presentes e configuradas são:
commitlint
para mensagens de commit.hadolint
para arquivos Dockerfile.markdownlint
para Markdown.
Para adicionar uma nova ferramenta de diagnóstico, veja as Ferramentas de Diagnóstico do plugin None-ls e cole a configuração no arquivo .config/nvim/lua/plugins/LSP/none-ls.lua
.
As ferramentas de formatação presentes e configuradas são:
mix
esurface
para arquivos Elixir.prettier
para arquivos Javascript, Typescript, Vue, CSS, SCSS, LESS, HTML, JSON, JSONC, YAML, Markdown, Markdown.mdx, Graphql, Handlebars, Svelte, e Astro.stylua
para arquivos Lua.
Para adicionar uma nova ferramenta de formatação, veja as Ferramentas de Formatação do plugin None-ls e cole a configuração no arquivo .config/nvim/lua/plugins/LSP/none-ls.lua
.
A funcionalidade do tab não funciona.
Quando pressionar enter, o comando será copiado para a linha de comando, então é necessário pressionar enter novamente para executá-lo.