NPM a package manager for javascript
Introdução
editarNPM(NodeJS package manager) é, primeiramente, uma ferramenta de gerenciamento de pacotes, suas versões e dependências, assim como um repositório para projetos baseados em NodeJS. É similar a outros gerenciadores de pacotes como o apt-get, homebrew e bower.
Com a utilização do NPM, o compartilhamento de códigos que resolvem pequenos e/ou específicos problemas é simplificado. Possibilitando que desenvolvedores, independente do projeto que estejam trabalhando, possam utilizar dessas soluções de uma maneira out of the box e reutilizável.
Outro ponto que é importante lembra é que uma vez que o seu projeto está dependendo de soluções de outros desenvolvedores a verificação de updates para essas dependências, assim como o download desses updates são realizados sem dificuldades com o NPM.
Conceitos Básicos
editarOs conjuntos de código reutilizável, distribuídos através do NPM, são chamados de pacotes, ou às vezes módulos. Um pacote é apenas um diretório com um ou mais arquivos nele, que obrigatoriamente tem um arquivo chamado "package.json" com alguns metadados sobre este pacote. Um aplicativo típico, como um site, pode depender de dezenas ou centenas de pacotes. Esses pacotes são geralmente pequenos. A idéia geral é criar um pequeno bloco de código que resolve um problema e o resolve bem. Isso torna possível o desenvolvimento de soluções maiores e personalizadas fora do escopo dos pequenos blocos de código compartilhados.
Pode-se encontrar pacotes para ajudar no desenvolvimento de aplicativos navegando no site do NPM. No site encontra-se diferentes tipos de pacotes e muitos desses pacotes são voltados para node, uma vez que o NPM começou como gerenciador de pacotes de node, portanto encontra-se muitos módulos que podem ser usados em server-side. Há também muitos pacotes que adicionam CLIs e módulos que auxiliam no desenvolvimento de front-end.
De uma maneira simple e resumida: o NPM funciona coletando e instalando pacotes de todos os lugares. Procurando, baixando e salvado o pacote que estamos procurando.
Instalação / Atualização
editarO NPM é instalado juntamente com o NodeJS, portanto para instalar o NPM basta instalar o Node.
macOS
editarInstalador Oficial
editarFaça o download do pkg na página de downloads do NodeJS e siga o passa a passo.
Homebrew
editar$ brew install node
Linux
editarDebian and Ubuntu based Linux distributions
editar$ curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
$ sudo apt-get install -y nodejs
$ sudo apt-get install -y build-essential
Para outros tipos de distribuições siga as instruções na documentação na página do NodeJS
Windows
editarFaça o download do binário na página de downloads do NodeJS e siga o passa a passo.
Testando a instalação
editarRode npm -v
. A versão deve ser superior a 2.1.8
Atualizando o NPM
editarO NPM vem instalado juntamente com o Node, porém o NPM é atualizado com mais frequência que o Node. Portanto para ter certeza de que se tem instalado a ultima versão do gerenciador de pacotes é necessário atualiza-lo. Uma vez que o próprio NPM é feito em JS, pode-se atualiza-lo através dele mesmo com o seguinte comando:
npm install npm@latest -g
Caso o resultado da execulção do comando acima seja um erro com código EACCES
, consulte a sessão seguinte.
Utilizando o NPM
editarO NPM pode instalar pacotes de forma global ou local. Por padrão, todos os pacotes são instalados localmente em uma pasta chamada node_modules
no diretório raiz do projeto. Esta pasta, naturalmente, tem por dono o usuário atual. Por outro lado pacotes instalados globalmente são instalados em {prefix}/lib/node_modules/
que tem como dono o administrador root e onde {prefix}
é, geralmente, /usr/
ou /usr/local
. Portanto para a instalação de pacotes globais há a necessidade do sudo
. Uma alternativa para instalar pacotes globais sem o uso de sudo é mover o local padrão de instalação dos pacotes para um local onde o usuário local tenha direito de escrita e leitura.
Mudando o local do pacotes globais
editar
$ npm config list
Esse comando fornece informações sobre as configurações do NPM conforme exemplo abaixo:
; cli configs
registry = "https://registry.npmjs.org/"
; builtin config undefined
# DO NOT MODIFY THIS FILE - use /etc/npmrc instead. = true
globalconfig = "/etc/npmrc"
globalignorefile = "/etc/npmignore"
prefix = "/usr/local"
; node bin location = /usr/bin/nodejs
; cwd = /home/alunos/Documentos
; HOME = /home/alunos
; 'npm config ls -l' to show all defaults.
$ npm config get prefix
/usr/local
Essa é a propriedade que queremos mudar para instalar os pacotes globais no diretório home
. Para criar um novo diretório na pasta
home
basta execultar o seguinte comando:
$ cd && mkdir .node_modules_global
$ npm config set prefix=$HOME/.node_modules_global
O que cria um pasta na home
do usuário atual e configura o NPM para instalar todos os novos pacotes globais para essa nova pasta. Para verificar que a configuração foi realizada com sucesso pode-se execultar o comando npm config list
e observar a mudança na variável prefix
. Que agora aponta para a pasta node_modules_global
.
Podemos portanto atualizar o npm da seguinte maneira:
$ npm install npm --global
$ npm -v
1.3.10
Podemos perceber do comando acima que a versão instalada pelo npm é 4.4.1
porém ainda estamos utilizando a versão 1.3.10
.
Para corrigir esse erro, temos que atualizar a variável PATH
do nosso sistema adicionando o seguinte comando export PATH="$HOME/.node_modules_global/bin:$PATH"
ao arquivo .profile
ou .bash_profile
e reinicie o terminal.
Instalando Pacotes Globais
editar
$ npm install uglify-js --global
O uso da flag --global
informa ao npm para instalar o pacote de forma global. Pode-se
utilizar a forma abreviada -g
.
$ npm install uglify-js --global
└─┬ uglify-js@2.6.2
├── async@0.2.10
├── source-map@0.5.3
├── uglify-to-browserify@1.0.2
└─┬ yargs@3.10.0
├── camelcase@1.2.1
├─┬ cliui@2.1.0
│ ├─┬ center-align@0.1.3
│ │ ├─┬ align-text@0.1.4
│ │ │ ├─┬ kind-of@3.0.2
│ │ │ │ └── is-buffer@1.1.2
│ │ │ ├── longest@1.0.1
│ │ │ └── repeat-string@1.5.4
│ │ └── lazy-cache@1.0.3
│ ├── right-align@0.1.3
│ └── wordwrap@0.0.2
├─┬ decamelize@1.1.2
│ └── escape-string-regexp@1.0.5
└── window-size@0.1.0
Ao instalar um pacotes, como é o caso do uglify-js, pacotes adicionais serão instalado também uma vez que o pacote desejado possui dependências.
Listando dependências globais
editar
Para listar os pacotes instados globalmente pode-se utilizar do seguinte comando:
$ npm list --global
├─┬ npm@3.7.5
│ ├── abbrev@1.0.7
│ ├── ansi-regex@2.0.0
│ ├── ansicolors@0.3.2
│ ├── ansistyles@0.1.3
....................
└─┬ uglify-js@2.6.2
├── async@0.2.10
├── source-map@0.5.3
├── uglify-to-browserify@1.0.2
Veja que as dependêcias dos pacotes globais também são listados. Porém caso não haja necessidade para tanto detalhe, pode-se informar a flag depth
que é o numero de
de camadas desejadas para a listagem
$npm list -g --depth=0
├── npm@3.7.5
└── uglify-js@2.6.2
Instalando dependências localmente
editar
Para instalar alguma dependência de forma local, basta não utilizar da flag --global
. A dependência será instalada dentro de uma pasta node_modules
criada no diretório pai onde se execulta o comando.
$ mkdir ~/project && cd ~/project
$ npm install underscore
/home/sitepoint/project
└── underscore@1.8.3
$ ls
node_modules
$ ls node_modules
underscore
Listando dependências locais
editar
Para listar as dependências locais basta execultar o seguinte comando dentro de um projeto.
$ npm list
/home/sitepoint/project
└── underscore@1.8.3
Removendo dependências locais
editar
$ npm uninstall underscore
- underscore@1.8.3 node_modules/underscore
$ npm list
/home/sitepoint/project
└── (empty)
Instalando uma versão especifica
editar
Para instalar uma versão específica de alguma dependência, bata adicionar @
seguido a versão desejada.
$ npm install underscore@1.8.2
/home/sitepoint/project
└── underscore@1.8.2
$ npm list
/home/sitepoint/project
└── underscore@1.8.2
Atualizando uma dependência
editar
<soruce>$ npm update underscore
underscore@1.8.3 node_modules/underscore
$ npm list
/home/sitepoint/project
└── underscore@1.8.3</source>
Gerenciando o cache
editar
Toda vez que um pacote é instaldo, uma copia é colocada em .npm
. Assim na próxima vez que esse mesmo pacote for instaldo não se tenha a necessidade de baixa-lo novamente.
$ ls ~/.npm
_locks minimist mkdirp registry.npmjs.org underscore
Para limpar esse cache basta execultar o seguinte comando: $ npm cache clean
.
Gerenciado dependências
editar
Para gerenciar as dependências de um projeto de forma mais compartilhável e de fácil gerenciamento, usa-se um arquivo de configuração chamado package.json
. Pode-se criar este arquivo com o comando npm init
.
$ npm init
This utility will walk you through creating a package.json file.
Press ^C at any time to quit.
name: (project) demo
version: (1.0.0)
description: Demo of package.json
entry point: (index.js)
test command:
git repository:
keywords:
author: Sitepoint
license: (ISC)
Esse comando gera o seguinte arquivo:
{
"name": "demo",
"version": "1.0.0",
"description": "Demo package.json",
"dependencies": {
"underscore": "^1.8.3"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Sitepoint",
"license": "ISC"
}
$ mkdir ~/demo && cd ~/demo
$ cp ~/project/package.json ~/demo
$ npm install
$ npm list
demo@1.0.0 /home/sitepoint/demo
└── underscore@1.8.3
O código acima demonstra como podemos configurar a aplicação a partir de um arquivo de configuração do npm. Basta execultar o comando npm install
.
Para salvar as dependências quando instalamos para o arquivo de configuração, podemos adicionar a flag --save
$ npm install request --save
$ npm list --depth=0
demo@1.0.0 /home/sitepoint/demo
├── request@2.53.0
└── underscore@1.8.3
Dessa forma o npm atualiza o arquivo package.json
para salvar as dependências necessarias.
"dependencies": {
"request": "^2.53.0",
"underscore": "^1.8.3"
}
devDependencies
editar
Algumas dependências são necessarias apenas para o ambiente de desenvolvimento como por exemplo um framework de teste.
npm install --save-dev qunitjs
Atualizando a propriedade devDependencies
do arquivo package.json
.
"devDependencies": {
"qunitjs": "^2.2.1"
}
A principal diferença entre devDependencies
e dependencies
é que quando execultamos npm install --production
as dependências de desenvolvimento não serão instaladas.
Prefixos de dependêcias
editar
Podemos observar do arquivo package.json
que há o caracter ~
antes da versão desejada. ~
é o default mas existem outros. Veja a seguir o que cada um significa.
~version
- ~1.2.3 utiliza a mais recente no padrão 1.2.x e não utiliza 1.3.0. (minor version)
^version
- ^1.2.3 utiliza a mais recente no padrão 1.x.x e não utiliza 2.0.0 (major version)
version
Utiliza a versão exata.
>version
Deve ser maior que a versão especificada
>=version
Deve ser maior ou igual a versão especificada
<version
Deve ser menor que a versão especificada
<=version
Deve ser menor ou igual a versão especificada
1.2.x
1.2.0, 1.2.1, etc., mas não 1.3.0
http://sometarballurl
Url para o package
*
Qualquer versão
Conclusão
editar
Foi coberto apenas uma primeira parte introdutória à utilização do npm. Como instalar o npm, como instalar uma dependência, como atualizar, como mudar o diretório para dependências globais para evitar a utilização de sudo. Porém existem outras funcionalidades que o npm fornece, como comando padrões para rodar a aplicação, para saber mais sobre o npm visite a página de documentação da ferramenta aqui.