Como instalar pacotes npm no NixOS?

6

No NixOS, instalei o pacote yarn como de costume executando $ nix-env -i yarn . Agora estou tentando executar yarn via $ yarn start . Mas isso me leva ao seguinte erro.

$ yarn start
    yarn start v0.20.3
    $ webpack-dev-server --env dev 
    sh: webpack-dev-server: command not found
    error Command failed with exit code 127.

Quando tento instalar o webpack-dev-server no meu caminho usual do NixOS, recebo um erro de 'não coincide com derivações'.

$ nix-env -i webpack-dev-server
error: selector ‘webpack-dev-server’ matches no derivations

Eu li que webpack-dev-server é um pacote npm e não tenho certeza de algumas perguntas sobre a relevância disso nesse caso.

  1. Faz sentido usar o npm, um gerenciador de pacotes diferente do nix, sob Nix?
  2. Se a resposta para (1) for sim, então como instalar o npm no NixOS? eu não veja npm disponível ao pesquisar por nix-env , pois $ nix-env -qa npm também não corresponde a nenhuma derivação.

Qual é a maneira correta de instalar o webpack-dev-server no NixOS?

EDITAR

Eu tentei instalar webpack-dev-server seguindo o link comentado e estava é capaz de instalar node2nix , mas não posso seguir o passo 2 listado no readme lá.

Localizei o arquivo mencionado na etapa 2 em /nix/store at

/nix/store/sgk7sxgqxrv2axkxjwc3y15apcqbrv1z-nixos-17.03.1482.1b57bf274a/nixos/pkgs/development/node-packages/node-packages.json

Eu posso abrir esse arquivo para ver os pacotes npm listados, mas as permissões são somente de leitura, mesmo rodando com sudo - então eu precisaria editar suas permissões para alterá-lo.

Parece que eu não deveria estar editando este arquivo /nix/store diretamente e deveria estar manipulando-o indiretamente via nix. Estou certo de que não devo editar este arquivo diretamente? Em caso afirmativo, como mais posso concluir a etapa 2 usando o nix ou algo para adicionar webpack-dev-server a ele?

    
por mherzl 21.07.2017 / 00:19

3 respostas

13

Existem várias maneiras de usar pacotes npm no nix:

Para meus projetos pessoais, uso nix-shell no shell que uso scripts npm para evitar a necessidade de pacotes globais npm (como com gulp). O processo se parece com algo assim (e é provavelmente muito semelhante para o fio):

$ nix-shell -p nodejs-8_x
[nix-shell:yourproject]$ npm install # installs npm deps to project-local node_modules
[nix-shell:yourproject]$ npm exec (...) # using scripts configured in package.json

Isso funciona bem para mim, pois nenhum dos meus pacotes tem dependências binárias. Este post descreve a criação de um default.nix para o seu projeto, para que você não tem que especificar dependências para cada invocação do nix-shell, mas é opcional.

Outra maneira é usar o npm2nix:

node2nix -i node-packages.json # creates ./default.nix
nix-shell # nix-shell will look for a default.nix, which above will have generated

O que fará com que o Nix gerencie todos os pacotes npm no projeto.

Pode ser uma boa idéia familiarizar-se com o nix-shell, já que tentar instalar pacotes de nós / qualquer dependência no seu perfil nix (através do nix-env ou nox) anula o objetivo do nix poluindo o namespace "global" .

Espero que isso ajude!

    
por 25.07.2017 / 22:55
6

Por alguma razão eu não sei, o nodePackages não está no namespace da raiz e não pode ser encontrado usando nix-env -qa

use nix-env -qaPA 'nixos.nodePackages' para listar os pacotes disponíveis.

$ nix-env -qaPA 'nixos.nodePackages' | grep -i web
nixos.nodePackages.webdrvr                     node-webdrvr-2.43.0-1
nixos.nodePackages.webpack                     node-webpack-2.6.1

Se não houver pacotes que você quer e você não pode fazer o seu próprio, tente solicitá-lo no github do NixOS.

    
por 21.07.2017 / 06:09
0

Como alternativa, eu também encontrei o comentário do CMCDragonkai na edição nº 3393 do Nixpkgs :

I just found out that you can change NPM's prefix directory. Something like:

npm config set prefix '~/mutable_node_modules.

This allows you to use NPM's global installation.

So it's possible to work around the purely functional model, by redirecting its outputs to somewhere that's not managed by Nix. But I guess it defeats the purpose of using Nix. And not every single software will support these types of configuration changes.

Still I feel it's very clunky having to switch between using nix-env for normal global Node packages, and npm for development packages. I guess that's why there's all those porting layers such as "npm2nix".

    
por 15.11.2018 / 20:59

Tags