
Muitos desenvolvedores enfrentaram um problema com os pacotes em sua estação de trabalho. Depois de alguns meses com experimentos, incluindo diferentes idiomas e cadeias de ferramentas, instalei o Elixir, o Haskell-stack, o Node.js / NVM e outras coisas. As coisas mais interessantes acontecem quando você precisa de versões diferentes do mesmo pacote para projetos diferentes. A humanidade já inventou uma solução diferente para criar um ambiente isolado e trocá-los quando necessário. Estamos usando o NVM para gerenciar versões do Node.js., Python Virtual Env para selecionar versões de itens do Python ou Docker para criar SO dentro de um SO. Mas nenhuma das soluções atende a todos os meus requisitos para o ambiente de desenvolvimento isolado.
Introdução aos requisitos para gerenciar a ferramenta de ambiente isolado
Era uma tarde fria de outono. Eu estava sentado na minha cozinha e pensei no isolamento perfeito para o espaço de trabalho do projeto com suas dependências. Na verdade, não, mas o parágrafo deve ter uma introdução.
Depois disso, escrevi os seguintes critérios para minha ferramenta de isolamento perfeita:
- Deve cobrir diferentes idiomas e pacotes: não apenas Node.js, Python ou Haskell.
- Sem virtualização. Somos jovens demais para toda essa merda. Vamos economizar nosso tempo.
- Todos os pacotes da área de trabalho devem ser fáceis de remover.
- Todos os ambientes da área de trabalho devem ser fáceis de remover.
- Meu IDE deveria estar trabalhando com tudo isso sem chamar Molfars das montanhas dos Cárpatos ucranianos.
Precisamos de uma xícara de chá e do Google, mas a princípio, uma xícara de chá
Lembro que uma vez que li sobre o gerenciador de pacotes declarativo que pode produzir um ambiente isolado e gerenciar todas as dependências do sistema e dependências do projeto Haskell.
Cinco minutos pesquisando, 30 minutos lendo e 1 hora tentando, permite-me descobrir que a ferramenta atual é tudo o que preciso. Tudo que eu preciso é amor. Mas pare, é outra música. Tudo que eu preciso é Nix.
Vamos comparar os requisitos que escrevi acima dos recursos reais do Nix.
- Compatível com macOS - sim.
- Abrange diferentes idiomas e pacotes - sim.
- Sem virtualização - realmente sem virtualização.
- Todos os pacotes da área de trabalho devem ser fáceis de remover - talvez sim, mas não sei como.
- Meu IDE deve estar trabalhando com todas essas coisas - não. Não há como integrar o Nix Environment ao Visual Studio Code.
Alerta de spoilerIsso foi há muito tempo. Quando a noite de outono estava fria, eu lhe disse, lembra? Mas hoje é uma noite completamente diferente. É outono quente e todos os meus problemas desapareceram.
Sirva-se. Extensão do código do Visual Studio Writing
A extensão ajuda a integrar o VS Code e o Nix-shell.
Estou com preguiça de escrever este capítulo do zero, então o texto abaixo é copiar / colar do README.md oficial da minha extensão.
Introdução
- Primeiro de tudo, você deve instalar o gerenciador de pacotes Nix .
- Reinicie o VS Code para garantir que o caminho para executar o nix-shell esteja configurado corretamente
- Instale a extensão
- Crie a configuração nix env, como default.nix, na raiz da área de trabalho do projeto
- Abra o palete de comandos (Cmd / Ctrl + Shift + P) e digite Selecionar ambiente
- Na lista de ambientes virtuais nix, escolha o que você deseja aplicar
Exemplo de execução do projeto Haskell
Para executar seu aplicativo Haskell, você precisa instalar o compilador GHC. Para evitar a instalação global do GHC e poder usar diferentes versões do compilador em seu host, faça isso usando o ambiente virtual nix.
Exemplo de compilador GHC dentro da loja NIX (shell.nix):
{ nixpkgs ? import <nixpkgs> {} }: let inherit (nixpkgs) pkgs; inherit (pkgs) haskellPackages; haskellDeps = ps: with ps; [ base lens mtl random ]; ghc = pkgs.haskell.packages.ghc864.ghcWithPackages haskellDeps; nixPackages = [ ghc pkgs.gdb haskellPackages.cabal-install ]; in pkgs.stdenv.mkDerivation { name = "snadbox-haskell-workspace"; buildInputs = nixPackages; }
Agora vamos tentar abrir nosso projeto no Visual Studio Code.

Você pode ver, o IDE não consegue encontrar um compilador. Vamos ativar o shell.nix env.

Bingo! Está tudo bem agora.
Conclusão
Espero que o artigo tenha trazido novas idéias sobre como facilitar sua vida e gerenciar seu projeto sem caos no sistema de arquivos.
Os benefícios dessa abordagem são:- Todos os pacotes em um espaço de trabalho separado e não afetam o escopo global contra o implícito.
- Seu IDE vê toda a equipe do espaço de trabalho e funcionando conforme o esperado
- Projeto simples de inicialização a partir de um arquivo de configuração em máquinas diferentes
Nada é perfeito em nosso mundo:- Precisa aprender um novo idioma para escrever arquivos de configuração
- A opção Nix CLI não tem significado óbvio e o tempo todo, quando você interage com as ferramentas da CLI, precisa da ajuda do comando read
- Todas as linguagens de programação têm seu material para instalar bibliotecas do ecossistema. Como NPM, Cabal, Cargo, Pip, etc. E quando você instala esse tipo de pacote via Nix, corre o risco de não funcionar da caixa alguns linters, ferramentas de análise etc.
Links externos