De hecho, es posible usar npm mediante programación, y se describió en revisiones anteriores de la documentación. Desde entonces se ha eliminado de la documentación oficial, pero todavía existe en el control de código fuente con la siguiente declaración:
Aunque npm se puede utilizar de forma programática, su API está diseñada para ser utilizada únicamente por la CLI y no se ofrecen garantías con respecto a su idoneidad para cualquier otro propósito. Si desea utilizar npm para realizar alguna tarea de manera confiable, lo más seguro es invocar el comando npm deseado con los argumentos adecuados.
La versión semántica de npm se refiere a la CLI en sí, en lugar de a la API subyacente. No se garantiza que la API interna permanezca estable incluso cuando la versión de npm indique que no se han realizado cambios importantes según semver .
En la documentación original, el siguiente es el ejemplo de código que se proporcionó:
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) { ... })
})
Dado que npm existe en la node_modules
carpeta, puede usarlo require('npm')
para cargarlo como cualquier otro módulo. Para instalar un módulo, querrá usar npm.commands.install()
.
Si necesita buscar en la fuente, también está en GitHub . Aquí hay un ejemplo de trabajo completo del código, que es el equivalente a ejecutarse npm install
sin ningún argumento de línea de comandos:
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);
});
});
Tenga en cuenta que el primer argumento de la función de instalación es una matriz. Cada elemento de la matriz es un módulo que npm intentará instalar.
Se puede encontrar un uso más avanzado en el npm-cli.js
archivo sobre control de código fuente.
npm install npm --save
primero. El ejemplo funciona muy bien :)npm
tenga cuidado, tiene muchas dependencias, por lo que agregarlo a su módulo probablemente resultará en que demore MUCHO más en descargarse. Consulte una de laschild_process
respuestas para aprovechar el npm global ya instalado en las máquinas de sus usuarios.npm.config
anpm.load
! ¡Incluso @isaacs no sabe qué tipo de cosas extrañas sucederán entonces! Consulte github.com/npm/npm/issues/4861#issuecomment-40533836 En su lugar, puede omitir el primer argumento.process.cwd()
)npm install npm --save
si. puede usar child_process para ejecutar un comando del sistema
fuente
npm.cmd
lugar.Puede usar child_process . exec o execSync para generar un shell y luego ejecutar el comando deseado dentro de ese shell, almacenando en búfer cualquier salida generada:
Si se proporciona una función de devolución de llamada, se llama con los argumentos (error, stdout, stderr). De esta manera, puede ejecutar la instalación como lo hace manualmente y ver el resultado completo.
El método child_process.execSync () es generalmente idéntico a child_process.exec () con la excepción de que el método no regresará hasta que el proceso hijo se haya cerrado por completo.
fuente
stdio: [0,1,2]
?en realidad puede ser un poco fácil
fuente
Tuve un gran tiempo tratando de que el primer ejemplo funcionara dentro de un directorio de proyecto, publicando aquí en caso de que alguien más encuentre esto. Por lo que puedo decir, NPM todavía funciona bien cargado directamente, pero debido a que asume CLI, tenemos que repetirnos un poco configurándolo:
fuente
pacote es el paquete que utiliza npm para recuperar metadatos y archivos tar del paquete. Tiene una API pública estable.
fuente
Soy el autor de un módulo que permite hacer exactamente lo que tienes en mente. Ver live-plugin-manager .
Puede instalar y ejecutar prácticamente cualquier paquete desde NPM, Github o desde una carpeta.
Aquí un ejemplo:
En el código anterior instalo el
moment
paquete en tiempo de ejecución, lo cargo y lo ejecuto. Al final lo desinstalo.Internamente no ejecuto
npm
cli, pero en realidad descargo paquetes y los ejecuto dentro de una caja de arena de VM de nodo.fuente
Una gran solución de @hexacyanide, pero resultó que NPM ya no emite eventos "log" (al menos a partir de la versión 6.4.1). En su lugar, confían en un módulo independiente https://github.com/npm/npmlog . Afortunadamente es un singleton, por lo que podemos llegar a la misma instancia que NPM usa para los registros y suscribirnos para los eventos de registro:
Como puede ver en el código, NPM también emite métricas de rendimiento en
process
, por lo que también podemos usarlo para monitorear el progreso.fuente
Otra opción, que no se mencionó aquí, es hacer un fork y ejecutar CLI directamente desde
./node_modules/npm/bin/npm-cli.js
Por ejemplo, desea poder instalar módulos de nodo desde un script en ejecución en la máquina, que no tiene NPM instalado. Y quieres hacerlo con CLI. En este caso, simplemente instale NPM en sus node_modules localmente mientras construye su programa (
npm i npm
).Entonces úsalo así:
Entonces su programa podría incluso empaquetarse en un archivo binario, por ejemplo con el paquete PKG . En este caso, debe usar la
--ignore-scripts
opción npm, porque se requiere node-gyp para ejecutar scripts de preinstalaciónfuente