Instalar programáticamente un paquete NPM proporcionando su versión.

Encontré cómo instalar npm paquetes programáticamente y el código funciona bien:

var npm = require("npm"); npm.load({ loaded: false }, function (err) { // catch errors npm.commands.install(["my", "packages", "to", "install"], function (er, data) { // log the error or data }); npm.on("log", function (message) { // log the progress of the installation console.log(message); }); }); 

Si quiero instalar la primera versión del paquete hello-world , ¿cómo puedo hacer esto en el lado de NodeJS, usando el módulo npm ?

Sé que puedo usar procesos secundarios, pero quiero elegir la solución del módulo npm .

NPM NodeJS API no está bien documentado, pero revisar el código ayuda.

Aquí encontramos la siguiente cadena:

 install.usage = "npm install" + "\nnpm install " + "\nnpm install @" + "\nnpm install @" + "\nnpm install @" + "\nnpm install " + "\nnpm install " + "\nnpm install " + "\nnpm install " + "\nnpm install /" + "\n\nCan specify one or more: npm install ./foo.tgz bar@stable /some/folder" + "\nIf no argument is supplied and ./npm-shrinkwrap.json is " + "\npresent, installs dependencies specified in the shrinkwrap." + "\nOtherwise, installs dependencies from ./package.json." 

Mi pregunta es sobre la versión, así que podemos hacer: hello-world@0.0.1 para instalar la versión 0.0.1 de hello-world .

 var npm = require("npm"); npm.load({ loaded: false }, function (err) { // catch errors npm.commands.install(["hello-world@0.0.1"], function (er, data) { // log the error or data }); npm.on("log", function (message) { // log the progress of the installation console.log(message); }); }); 

No hice la prueba, pero estoy seguro de que podemos usar cualquier formato de las soluciones install.usage .

Escribí una función que convierte el objeto de dependencies en una matriz que se puede pasar a la llamada a la función de install .

dependencies:

 { "hello-world": "0.0.1" } 

La función obtiene la ruta al archivo package.json y devuelve una matriz de cadenas.

 function createNpmDependenciesArray (packageFilePath) { var p = require(packageFilePath); if (!p.dependencies) return []; var deps = []; for (var mod in p.dependencies) { deps.push(mod + "@" + p.dependencies[mod]); } return deps; } 

Mientras hago este tipo de implícito MUCHO para mi trabajo, escribí un módulo nodeJS simple pero eficiente para manejar el proceso fácilmente.

Repositorio Github de npmi

o

 npm install npmi 

Soy el autor del módulo que te permite hacer 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:

 import {PluginManager} from "live-plugin-manager"; const manager = new PluginManager(); async function run() { await manager.install("moment"); const moment = manager.require("moment"); console.log(moment().format()); await manager.uninstall("moment"); } run(); 

En el código anterior instalo el paquete de moment 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 nodos VM.

Para instalar una versión específica solo usa:

  await manager.install("moment", "2.20.1"); 

Cuando escribo una aplicación que tiene dependencias, uso el archivo package.json y lo incluyo en el directorio con mi aplicación. Tal vez se vea un poco así.

 { "name": "MyApp", "description": "My App.", "version": "0.0.1", "dependencies": { "express": "3.4.3", "socket.io": "0.9.16" } } 

Creo que puedes usar un formato similar para instalar con NPM desde la línea de comandos. Con package.json simplemente haces npm install -d (asumiendo que -d significa “dependencias”)

Tu pregunta es sobre hacerlo programáticamente. ¿Ha intentado simplemente agregar un segundo argumento como (“npm @ version #”)?

Si lo estuviera haciendo programáticamente, podría intentar algo como esto:

  var pjson = require('./package.json'); 

De esa manera puedo mantener el control de versiones y usar la simplicidad del archivo package.json.

Agregué algo más de información en los comentarios, en caso de que aún no hayas visto, aquí están los documentos para la instalación de npm. https://npmjs.org/doc/cli/npm-install.html

No he podido desenterrar ninguna otra información específica sobre su caso específico, tal vez no haya un método de instalación por versión mediante progtwigción, pero eso no tendría sentido, tiene que ser factible.