Na verdade, é possível usar o npm programaticamente e ele foi descrito em revisões anteriores da documentação. Desde então, foi removido da documentação oficial, mas ainda existe no controle de origem com a seguinte declaração:
Embora o npm possa ser usado programaticamente, sua API deve ser usada apenas pela CLI e nenhuma garantia é feita em relação à sua adequação para qualquer outra finalidade. Se você quiser usar o npm para realizar alguma tarefa de maneira confiável, a coisa mais segura a fazer é invocar o comando npm desejado com os argumentos apropriados.
A versão semântica do npm se refere à própria CLI, e não à API subjacente. A API interna não tem garantia de permanecer estável, mesmo quando a versão do npm indica que nenhuma alteração significativa foi feita de acordo com semver .
Na documentação original, o seguinte é o exemplo de código fornecido:
var npm = require('npm')
npm.load(myConfigObject, function (er) {
if (er) return handlError(er)
npm.commands.install(['some', 'args'], function (er, data) {
if (er) return commandFailed(er)
// command succeeded, and data might have some info
})
npm.registry.log.on('log', function (message) { ... })
})
Como o npm existe na node_modules
pasta, você pode usar require('npm')
para carregá-lo como qualquer outro módulo. Para instalar um módulo, você vai querer usar npm.commands.install()
.
Se você precisar procurar na fonte, também está no GitHub . Aqui está um exemplo completo de trabalho do código, que é o equivalente a executar npm install
sem nenhum argumento de linha de comando:
var npm = require('npm');
npm.load(function(err) {
// handle errors
// install module ffi
npm.commands.install(['ffi'], function(er, data) {
// log errors or data
});
npm.on('log', function(message) {
// log installation progress
console.log(message);
});
});
Observe que o primeiro argumento para a função de instalação é uma matriz. Cada elemento da matriz é um módulo que o npm tentará instalar.
O uso mais avançado pode ser encontrado no npm-cli.js
arquivo de controle de origem.
npm install npm --save
primeiro. Exemplo funciona muito bem :)npm
tem muitas dependências, portanto, adicioná-lo ao seu módulo provavelmente fará com que demore MUITO mais tempo para baixar. Confira uma daschild_process
respostas para aproveitar o npm global já instalado nas máquinas de seus usuários.npm.config
paranpm.load
! Nem mesmo @isaacs sabe que tipo de coisas estranhas acontecerão! Consulte github.com/npm/npm/issues/4861#issuecomment-40533836 Em vez disso, você pode simplesmente pular o primeiro argumento.process.cwd()
)npm install npm --save
sim. você pode usar child_process para executar um comando do sistema
fonte
npm.cmd
invés.para ver a saída também, você pode usar:
desta forma, você pode assistir a instalação como faz manualmente e evitar surpresas como buffer cheio, etc.
fonte
pode realmente ser um pouco fácil
fonte
Tive muita dificuldade em fazer o primeiro exemplo funcionar dentro de um diretório de projeto, postando aqui no caso de alguém encontrar isso. Pelo que eu posso dizer, o NPM ainda funciona bem carregado diretamente, mas como ele assume CLI, temos que nos repetir um pouco ao configurá-lo:
fonte
pacote é o pacote que o npm usa para buscar metadados e tarballs do pacote. Ele tem uma API pública estável.
fonte
Sou autor de um módulo que permite fazer exatamente o que você tem em mente. Veja live-plugin-manager .
Você pode instalar e executar praticamente qualquer pacote do NPM, Github ou de uma pasta.
Aqui está um exemplo:
No código acima eu instalo o
moment
pacote em tempo de execução, carrego e executo. No final, desinstalo-o.Internamente, eu não executo o
npm
cli, mas na verdade faço o download dos pacotes e executo dentro de uma sandbox de VM do nó.fonte
Uma ótima solução por @hexacyanide, mas descobriu-se que o NPM não emite mais evento "log" (pelo menos a partir da versão 6.4.1). Em vez disso, eles contam com um módulo independente https://github.com/npm/npmlog . Felizmente, é um singleton, então podemos alcançar a mesma instância que o NPM usa para registros e se inscrever para eventos de registro:
Como você pode ver no código, o NPM também emite métricas de desempenho no
process
, portanto, também podemos usá-lo para monitorar o progresso.fonte
Outra opção, que não foi mencionada aqui, é fazer fork e executar CLI diretamente de
./node_modules/npm/bin/npm-cli.js
Por exemplo, você deseja instalar os módulos de nó a partir da execução do script na máquina, que não possui o NPM instalado. E você deseja fazer isso com CLI. Neste caso, basta instalar o NPM em seus node_modules localmente enquanto constrói seu programa (
npm i npm
).Em seguida, use-o assim:
Então seu programa pode ser compactado em um arquivo binário, por exemplo, com o pacote PKG . Neste caso, você precisa usar a
--ignore-scripts
opção npm, porque o node-gyp é necessário para executar scripts de pré-instalaçãofonte