Criando um repositório npm para armazenar seus módulos privados

Posted . Visible to the public.

Para executar os passos a seguir é necessário que você possua instalado o git, node e o npm.
Se você ainda não instalou existe um card que pode te ajudar: instalação do node no linux
Testado no ubuntu@13.04

Nas suas aplicações com o node.js ao instalar um módulo ele é obtido do registry do npm Show archive.org snapshot . Este registry é um banco de dados criado no couchdb Show archive.org snapshot que armazena todos os módulos atualmente (você pode buscar algum módulo aqui Show archive.org snapshot ou executando npm search <nome do pacote>).
Para criarmos o nosso repositório privado teremos que criar uma replicação do registry do npm.

Etapa 1: criação do registry

Instalar o couchdb caso o mesmo não esteja instalado:
sudo apt-get install couchdb
Obs: no couchdb existe um controle para visualizar/administrar os dados, o Futon Show archive.org snapshot . Você pode acessa-lo aqui: http://127.0.0.1:5984/_utils/index.html Show archive.org snapshot

Agora crie um banco chamado registry, que será onde armazenaremos nossos módulos privados:
curl -X PUT http://localhost:5984/registry
Abra o arquivo /etc/couchdb/local.ini e adicione o seguinte conteúdo:

[couch_httpd_auth]
public_fields = appdotnet, avatar, avatarMedium, avatarLarge, date, email, fields, freenode, fullname, github, homepage, name, roles, twitter, type, _id, _rev
users_db_public = true

[httpd]
secure_rewrites = false

[couchdb]
delayed_commits = false

Obs: Neste mesmo arquivo, na sessão [admins] adicione um usuario/senha para o couchdb.
Reinicie o couchdb para aplicar as alterações.

Etapa 2: configuração do npm

Agora com o couchdb instalado vamos configurar o npm para utilizá-lo.
O npm disponibiliza um repositório com scripts que farão quase tudo que precisaremos para configurar nosso ambiente (dele que retirei grande parte do que está descrito neste card), você pode acessá-lo aqui: https://github.com/npm/npm-registry-couchapp Show archive.org snapshot .

git clone git://github.com/npm/npm-registry-couchapp
cd npm-registry-couchapp
npm install

Agora vamos executar alguns scripts para configurar nosso banco.

#obs: lembre de substituir seu usuário/senha nos scripts abaixo
#script 1:
npm start \
  --npm-registry-couchapp:couch=http://usuario:senha@localhost:5984/registry

#script 2:
npm run load \
  --npm-registry-couchapp:couch=http://usuario:senha@localhost:5984/registry

#script 3:
npm run copy \
  --npm-registry-couchapp:couch=http://usuario:senha@localhost:5984/registry

Etapa 3: configurar o npm-client para utilizar nossa réplica

Como é um banco privado, se você tentar publicar algum módulo, o couchdb responderá com um erro e impedirá que seu módulo seja salvo.
Para adicionarmos um novo usuário no banco e configurar o npm-client para utilizá-lo execute o comando abaixo e informe os dados:
npm --registry http://usuario:senha@localhost:5984/registry/_design/scratch/_rewrite adduser
Agora se você olhar o arquivo ~/.npmrc verá que ele está com as credenciais que você informou.
Você também poderá ver no Futon que seu usuário foi adicionado: http://127.0.0.1:5984/_utils/database.html?_users Show archive.org snapshot .

O arquivo ~/.npmrc contém todas as nossas configurações e pode ser editado manualmente ou através dos scripts via npm.

Com seu usuário configurado precisamos dizer para o npm utilizar o registry ele. Para isto execute o script abaixo:

npm config set \
  registry=http://<nome do usuario>:<senha de seu usuário>@localhost:5984/registry/_design/app/_rewrite

Agora se você abrir o arquivo .npmrc você verá que ele está com o conteúdo:

_auth = GZVgbGn5ZXI6ZmlibzEyjw==
registry = http://<nome do usuario>:<senha de seu usuário>@localhost:5984/registry/_design/app/_rewrite
email = seu_email@email.com

Etapa 4: publicar um módulo

No package.json do seu módulo adicione as configurações para publicação:
...
"publishConfig": {
"registry": "http://localhost:5984/registry/_design/app/_rewrite"
},
...
Pronto! Agora basta publicar o módulo e ele estará salvo no seu registry:
npm publish

Etapa 5: criando a replicação do registry do npm

Para fazer a replicação do banco de dados do npm existem duas opções:

1 - A primeira é criar uma réplica apenas com os metadados dos módulos, ou seja, apenas com referências para os arquivos ( https://skimdb.npmjs.com/registry Show archive.org snapshot ). Utilizando esta opção o seu banco ficará, hoje, com aproximadamente 400 mb de dados (você pode ver na imagem em anexo). Quando você tentar instalar algum módulo, ele será buscado na sua réplica, mas seus arquivos serão obtidos do registry do npm:

# O parâmetro continuous:true fará com que sua replicação sempre fique sincronizada com o registry do npm
# caso você não queira receber atualizações de novos pacotes este parâmetro pode ser removido

curl -X POST http://usuario:senha@127.0.0.1:5984/_replicate -d '{"source":"https://skimdb.npmjs.com/registry/", "target":"registry", "continuous":true, "create_target":true}' -H "Content-Type: application/json" 

2 - A segunda opção é criar a replicação com todos os dados, incluindo os arquivos dos módulos ( https://fullfatdb.npmjs.com/registry Show archive.org snapshot ). Não cheguei a utiliza-la devido ao tempo que levaria para sincronizar tudo, além do espaço em disco que seria necessário (alguns GB a mais do que na primeira opção xD):

curl -X POST http://usuario:senha@127.0.0.1:5984/_replicate -d '{"source":"https://fullfatdb.npmjs.com/registry/", "target":"registry", "continuous":true, "create_target":true}' -H "Content-Type: application/json" 
Victor Carvalho
Last edit
Tags
Posted by Victor Carvalho to ZeroGlosa (2014-04-26 22:28)