Como instalar um módulo NPM privado sem meu próprio registro?


329

Peguei um código compartilhado e o coloquei em um módulo NPM, um que não quero carregar no registro central. A questão é: como instalá-lo de outros projetos?

A maneira óbvia é provavelmente configurar meu próprio registro do NPM, mas, de acordo com a documentação, isso envolve muitos problemas.

Posso apenas instalar um módulo NPM que fica no sistema de arquivos local, ou talvez até no git?

npm install --from-git git@server:project

Respostas:


263
cd somedir
npm install .

ou

npm install path/to/somedir

somedirdeve conter o package.jsoninterior.

Também conhece o git:

npm install git://github.com/visionmedia/express.git

4
A solução path / to / somedir meio que funciona, mas é meio horrível, porque todas as declarações de necessidade precisam incluir esse caminho relativo ou absoluto. Por favor me corrija se eu estou fazendo algo errado ...
Luke Bayes

3
@ Lucas sim, você está errado. Depois que npm installtodos os arquivos são copiados para o diretório do projeto. Portanto, os caminhos nas requireinstruções serão relativos apenas ao diretório do seu projeto.
amigos estão

4
Estou confuso com a parte superior e a única razão de eu não ter testado isso pessoalmente é que ainda estou aprendendo e não tenho um módulo privado para trabalhar. Enfim, alterando seu diretório para onde o módulo está e, em seguida, chamando, installisso não seria instalado apenas e não para o projeto para o qual você deseja usá-lo?
Adam Beck

11
Nota lateral: (a) ao usar repositórios git, você pode especificar um branch / commit / tag adicionando #<ref>a ao final do URL do git, por exemplo git://github.com/visionmedia/express.git#v0.0.1; (b) Para ser seguro, adicione "private": trueao package.json de seus repositórios particulares. Isso garantirá que o npm nunca permita que você publique acidentalmente seu molho secreto no registro oficial do npm. (de acordo com debuggable.com/posts/… )
Rafael Xavier

9
FYI se você está servindo o seu git-se via http você precisa npm i git+http://all/the/things.gitmesmo que git clone http://all/the/things.gitfunciona muito bem
SLF

527

Nos seus módulos npm privados, adicione

"private": true 

para o seu package.json

Em seguida, para referenciar o módulo privado em outro módulo, use isso no seu package.json

{
    "name": "myapp",
    "dependencies": {
        "private-repo": "git+ssh://git@github.com:myaccount/myprivate.git#v1.0.0",
    }
}

59
Esta é a resposta realmente correta se você quiser que o package.json mantenha a lista de dependências de repositório particular, que é uma coisa boa que você deve fazer.

6
No exemplo, está fazendo referência a uma tag específica, mas se você não tiver uma, ela será padronizada como master. (consulte git-scm.com/book/en/Git-Basics-Tagging )
250R

4
Eu não entendo como essa linha de comando pode baixar código de um repositório particular do github se eu não estiver fornecendo minhas credenciais! Então, como posso passar minhas credenciais no github?
Renato Gama

28
Observe que a "private": truepeça não é necessária, mas ajudará a impedir que seu repositório particular seja acidentalmente publicado no registro público do npm.
precisa saber é o seguinte

2
O npm também procura várias variáveis ​​de ambiente. A partir do manual na npm install <git remote url>seção, há opções como GIT_ASKPASSeGIT_SSH exemplo de uso .Um para escolher uma outra tecla que o id_rsa padrão:GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github.com:npm/npm.git
Jasmine Hegman

62

Posso apenas instalar um pacote NPM que fica no sistema de arquivos local, ou talvez até no git?

Sim você pode! Nos documentos https://docs.npmjs.com/cli/install

Um pacote é:

  • a) uma pasta contendo um programa descrito por um arquivo package.json
  • b) um tarball compactado com gzip contendo (a)
  • c) um URL que resolva para (b)
  • d) a <name>@<version> publicado no registro com (c)
  • e) a <name>@<tag> que aponta para (d)
  • f) a <name> que tenha uma etiqueta "mais recente" satisfazendo (e)
  • g) a <git remote url> que resolva para (b)

Npm não é brilhante?


2
Observe que se você optar pela opção b), na verdade, ela deve ser um tarball compactado com gzip , um mero arquivo zip não fará isso. Ou seja, se você criar seu pacote tar -czf my-package.tar.gz dist(supondo que sua distpasta também tenha um package.jsonarquivo adequado ), será possível npm install ../my-lib/my-package.tar.gzem seu outro projeto.
Dániel Kis-Nagy

48

Atualização de janeiro de 2016

Além de outras respostas , às vezes há o cenário em que você deseja ter módulos privados disponíveis em um contexto de equipe.

O Github e o Bitbucket suportam o conceito de gerar uma chave de API de equipe . Essa chave de API pode ser usada como a senha para executar solicitações de API como essa equipe.

Nos seus módulos npm privados, adicione

"private": true 

para o seu package.json

Em seguida, para referenciar o módulo privado em outro módulo, use isso no seu package.json

    {
        "name": "myapp",
        "dependencies": {
            "private-repo":
"git+https://myteamname:aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4@bitbucket.org/myprivate.git",
        }
    }

onde team name = myteamname , e API Key = aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4

Aqui, faço referência a um repositório de bitbucket, mas é quase idêntico usando o github também.

Finalmente, como alternativa, se você realmente não se importa em pagar US $ 7 por mês (no momento da redação), agora pode ter módulos privados do NPM prontos para uso.


Você pode usar isso se quiser ter um módulo global?
PI.

Isso não funciona para mim, eu tenho medo. O remoto e o repositório não foram encontrados. Alguma ideia?
Thomas Bormans 03/02

@ThomasBormans - ainda está tendo problemas? Por favor, cole (embaralhe sua chave teamname / api) o que você tem como linha na seção de dependências do package.json - conforme as instruções acima. Descobri que isso funciona bem para repositórios particulares do github e do bitbucket. Qual você está usando?
Arcseldon

@arcseldon "name": "git + key: x-oauth-basic@bitbucket.org/user/repo.git " retorna EISDIR: operação ilegal em um diretório, leia . E "name": "git + user: key@bitbucket.org/repo.git " retorna vários erros, incluindo estas palavras remote: Not Found, fatal: repository, Command failed: git clone . Alguma ideia?
Thomas Bormans 03/02

Tente seguir o formato "exato" que eu dei na resposta: "git + https: // <myteamname>: <my_key> @ bitbucket.org / <my_repo_name> .git Como você gerou a chave da API? está correto nas configurações do bitbucket ... desculpe-me por perguntar o óbvio, mas tenho quase 100% de confiança que isso deve funcionar.
arcseldon

30

FWIW: Eu tive problemas com todas essas respostas ao lidar com um repositório de organização privada.

O seguinte funcionou para mim:

npm install -S "git+https://username@github.com/orgname/repositoryname.git"

Por exemplo:

npm install -S "git+https://blesh@github.com/netflix/private-repository.git"

Não sei ao certo por que as outras respostas não funcionaram para mim neste caso, porque foram as que tentei primeiro antes de acessar o Google e encontrar essa resposta. E as outras respostas são o que eu fiz no passado.

Espero que isso ajude outra pessoa.


2
Você pode usar uma subpasta do repositório git?
10284 Chris

Trabalhou para mim em 2019! Mas eu tinha que garantir que o git tivesse credenciais para acessar essa conta. (Por exemplo clone teste git duas vezes com https://, e assegurar a senha não é necessária na segunda corrida Então você é bom para ir.!)
joeytwiddle

9

Eu tive esse mesmo problema e, depois de algumas pesquisas, encontrei o Reggie ( https://github.com/mbrevoort/node-reggie ). Parece bastante sólido. Permite a publicação leve de módulos NPM em servidores privados. Não é perfeito (sem autenticação na instalação), e ainda é muito jovem, mas eu o testei localmente, e parece fazer o que ele diz que deve fazer.

Isso é ... (e isso apenas dos documentos)

npm install -g reggie
reggie-server -d ~/.reggie

então cd no diretório do módulo e ...

reggie -u http://<host:port> publish 
reggie -u http://127.0.0.1:8080 publish 

finalmente, você pode instalar pacotes do reggie apenas usando essa url em um comando direto do npm install ou de dentro de um package.json ...

npm install http://<host:port>/package/<name>/<version>
npm install http://<host:port>/package/foo/1.0.0

ou..

dependencies: {
    "foo": "http://<host:port>/package/foo/1.0.0"
}

7

Estruture seu código de maneira acessível, como abaixo. Se isso é possível para você.

  • NodeProjs \ Apps \ MainApp \ package.json

  • NodeProjs \ Modules \ DataModule \ package.json

Em MainApp @ NodProjs \ Apps \ MainApp \

npm install --S ../../Modules/DataModule

Pode ser necessário atualizar o package.json como:

 "dependencies": {
       "datamodule": "../../Modules/DataModule"
}

Isso funcionou para a minha situação.


5

O Npm agora oferece módulos hospedados privados ilimitados por US $ 7 / usuário / mês, usados ​​dessa forma

cd private-project
npm login

no seu pacote json set "name": " @username/private-project"

npm publish

depois, para exigir seu projeto:

cd ../new-project
npm install --save @username/private-project

1
Isso requer uma etapa de login do lado do cliente?
Aidan Hoolachan

O que é uma alternativa para isso? Por exemplo, se você deseja hospedar seu "pacote" no S3 e puxar a partir daí.
Con Contekakos

4

Começando com a resposta do arcseldon , descobri que o nome da equipe era necessário no URL da seguinte forma:

npm install --save "git+https://myteamname@aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4@bitbucket.org/myteamname/myprivate.git"

E observe que a chave da API está disponível apenas para a equipe, não para usuários individuais.


2

Configure para instalar a partir do repositório público do Github, mesmo se a máquina estiver sob firewall:

dependencies: {
   "foo": "https://github.com/package/foo/tarball/master"
}

2

Eu uso o seguinte com um repositório privado do github:

npm install github:mygithubuser/myproject

2

Era isso que eu estava procurando :

# Get the latest from GitHub, public repo:
$ npm install username/my-new-project --save-dev
# Bitbucket, private repo:
$ npm install git+https://token:x-oauth-basic@github.com/username/my-new-project.git#master
$ npm install git+ssh://git@github.com/username/my-new-project.git#master

#  or from Bitbucket, public repo:
$ npm install git+ssh://git@bitbucket.org/username/my-new-project.git#master --save-dev
# Bitbucket, private repo:
$ npm install git+https://username:password@bitbucket.org/username/my-new-project.git#master
$ npm install git+ssh://git@bitbucket.org/username/my-new-project.git#master
# Or, if you published as npm package:
$ npm install my-new-project --save-dev

2

Você pode usar o Verdaccio para esse fim, que é um registro proxy npm privado leve, construído em Node.js. Também é gratuito e de código aberto. Ao usar o Verdaccio, ele não envolve tanta trabalheira quanto um registro simples do npm privado.

Você pode encontrar informações detalhadas sobre como instalar e executá-lo em seu site, mas aqui estão as etapas:

Exige node >=8.x.

    // Install it from npm globally
    npm install -g verdaccio

    // Simply run with the default configuration that will host the registry which you can reach at http://localhost:4873/
    verdaccio

    // Set the registry for your project and every package will be downloaded from your private registry
    npm set registry http://localhost:4873/

    // OR use the registry upon individual package install
    npm install --registry http://localhost:4873

Ele também possui uma janela de encaixe, para que você possa publicá-la com facilidade na sua janela de encaixe disponível publicamente, e voilá, você possui um repositório npm privado que pode ser distribuído para outras pessoas de uma maneira que você a configura!


0

Muito simples -

npm config set registry https://path-to-your-registry/

Na verdade, define registry = "https://path-to-your-registry"esta linha para/Users/<ur-machine-user-name>/.npmrc

Todo o valor que você definiu explicitamente ou foi definido por padrão pode ser visto por: npm config list

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.