Como instalar os pacotes npm no NixOS?

10

No NixOS, instalei o pacote yarnnormalmente, executando $ nix-env -i yarn. Agora estou tentando executar yarnvia $ 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 webpack-dev-serverda maneira usual do NixOS, recebo o erro 'corresponde a nenhuma derivação'.

$ 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 neste caso.

  1. Faz sentido usar o npm, um gerenciador de pacotes diferente do nix, no Nix?
  2. Se a resposta a (1) for sim, como instalar o npm no NixOS? Não vejo o npm disponível ao pesquisar via nix-env, pois $ nix-env -qa npmtambém não corresponde a derivações.

Qual é a maneira correta de instalar webpack-dev-serverno NixOS?


EDITAR

Tentei instalar webpack-dev-serverseguindo o link comentado e consegui instalar node2nix, mas não consigo seguir a etapa 2 listada no leia-me lá.

I localizado o arquivo referenciado no passo 2 em /nix/storepelo

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

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

Parece que eu não deveria editar este /nix/storearquivo diretamente e, em vez disso, deveria manipulá-lo indiretamente via nix. Estou certo de que não devo editar este arquivo diretamente? Em caso afirmativo, de que outra forma posso concluir a etapa 2 usando o nix ou algo a acrescentar webpack-dev-server?

mherzl
fonte
@EmmanuelRosa obrigado pelo link; Tentei seguir as instruções e atualizei esta pergunta de acordo com os resultados dessa tentativa.
mherzl
/nix/storeé somente leitura. Você precisa repo git clone e uso -I nixpkgs=/path/to/repode nix-*comando
wizzup

Respostas:

15

Existem várias maneiras de usar pacotes npm através do nix:

Para meus projetos pessoais, eu uso nix-shellno shell scripts npm para evitar a necessidade de pacotes globais npm (como no gulp). O processo se parece com isso (e provavelmente é muito semelhante para fios):

$ 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 possui dependências binárias. Esta publicação descreve a criação de um default.nix para o seu projeto, para que você não precise especificar dependências para cada chamada 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 em seu perfil do nix (por meio do nix-env ou nox) anula o objetivo do nix poluindo o espaço de nomes "global".

Luke Adams
fonte
Você poderia expandir sobre isso com relação a pacotes usando binding.gyp por exemplo: github.com/mateogianolio/nblas
CMCDragonkai
1
Eu descobri como fazer isso para pacotes binários. Você precisa das nodePackages_6_x.node-gypbibliotecas e de outras bibliotecas como blas, então, quando estiver tudo junto, poderá usar npm install ....pacotes que usam o node-gyp.
CMCDragonkai
1
Em relação ao primeiro método, como alternativa à npm scriptssolução, acho que a adição de pacotes npm globais ao nix-shellefetivo, por exemplo nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Aviso: nixos e node noob aqui.)
Ryne Everett
A única coisa que não entendo sobre o primeiro método é como realmente instalar o pacote em si, ou seja, onde bintermina o binário do package.json do projeto ?
Ryne Everett
@ ryne-everett Se você executar npm install, os executáveis ​​serão vinculados ao node_modules/.bin. Veja aqui .
Luke Adams
8

Por alguma razão que não sei, o nodePackages não está no espaço de nomes 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 desejados e você não puder criar seus próprios, tente solicitá-lo no NixOS github .

wizzup
fonte
1
Eu estou usando apenas o gerenciador de pacotes nix e foi capaz de fazê-lo funcionar com:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro 14/11
A maioria deles não está no espaço de nomes raiz, pois tornaria a pesquisa normal lenta. É o mesmo com os pacotes Haskell. O espaço para nome deles é muito grande.
user239558
3

Como alternativa, também encontrei o comentário de CMCDragonkai sobre a edição Nixpkgs # 3393 :

Acabei de descobrir que você pode alterar o diretório de prefixos do NPM. Algo como:

npm config set prefix '~/mutable_node_modules.

Isso permite que você use a instalação global do NPM.

Portanto, é possível contornar o modelo puramente funcional, redirecionando suas saídas para algum lugar que não seja gerenciado pelo Nix. Mas acho que isso derrota o propósito de usar o Nix. E nem todos os softwares suportam esses tipos de alterações na configuração.

Ainda sinto que é muito desajeitado ter que alternar entre usar nix-env para pacotes Node globais normais e npm para pacotes de desenvolvimento. Eu acho que é por isso que existem todas essas camadas de portabilidade, como "npm2nix".

toraritte
fonte