Могу ли я установить пакет NPM из javascript, работающего в узле.Джей?


могу ли я установить пакет NPM из файла javascript, работающего в узле.Джей? Например, я хотел бы иметь сценарий, назовем его "сценарий.ОАО" что-то (...с помощью НПМ или нет...) установить пакет, как правило, доступны через npm. В этом примере я хотел бы установить "FFI". (npm install ffi)

7 63

7 ответов:

можно использовать npm программно, и это было изложено в старых редакциях документации. С тех пор он был удален из официальной документации, но все еще существует в системе управления версиями со следующим утверждением:

хотя npm можно использовать программно, его API предназначен для использования CLI только, и никакие гарантии не сделаны относительно своей пригодности для любого другая цель. Если вы хотите использовать npm для надежного выполнения некоторые задачи, самый безопасный, что нужно сделать, чтобы вызвать нужную команду npm соответствующие аргументы.

семантическая версия npm ссылается на сам CLI, а не на базовых API. внутренний API не гарантируется оставаться стабильным даже если версия npm указывает, что никаких критических изменений не было сделано по данным semver.

в исходной документации ниже приведен пример кода, который был при условии:

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) { ... })
})

С npm существует node_modules папка, вы можете использовать require('npm'), чтобы загрузить его, как и любой другой модуль. Чтобы установить модуль, вы хотите использовать npm.commands.install().

Если вам нужно посмотреть в источнике, то это также на GitHub. Вот полный рабочий пример кода, который является эквивалентом бега npm install без каких-либо аргументов командной строки:

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);
  });
});

обратите внимание, что первый аргумент для установки функция-это массив. Каждый элемент массива-это модуль, который npm попытается установить.

более расширенное использование можно найти в npm-cli.js файл в системе управления версиями.

да. вы можете использовать child_process для выполнения системной команды

var exec = require('child_process').exec,
    child;

 child = exec('npm install ffi',
 function (error, stdout, stderr) {
     console.log('stdout: ' + stdout);
     console.log('stderr: ' + stderr);
     if (error !== null) {
          console.log('exec error: ' + error);
     }
 });

Если вы хотите иметь выход также можно использовать:

var child_process = require('child_process');
child_process.execSync("npm install ffi",{stdio:[0,1,2]});

таким образом, вы можете смотреть установку, как вы делаете это под рукой и избежать неприятных сюрпризов (полный буфер и т. д.)

это действительно может быть немного легко

var exec = require('child_process').exec;
child = exec('npm install ffi').stderr.pipe(process.stderr);

У меня было чертовски много времени, пытаясь получить первый пример для работы внутри каталога проекта, разместив здесь, Если кто-то еще найдет это. Насколько я могу судить, NPM по-прежнему отлично работает с прямой загрузкой, но поскольку он предполагает CLI, мы должны немного повторить его настройку:

// this must come before load to set your project directory
var previous = process.cwd();
process.chdir(project);

// this is the part missing from the example above
var conf = {'bin-links': false, verbose: true, prefix: project}

// this is all mostly the same

var cli = require('npm');
cli.load(conf, (err) => {
    // handle errors
    if(err) {
        return reject(err);
    }

    // install module
    cli.commands.install(['ffi'], (er, data) => {
        process.chdir(previous);
        if(err) {
            reject(err);
        }
        // log errors or data
        resolve(data);
    });

    cli.on('log', (message) => {
        // log installation progress
        console.log(message);
    });
});

Я автор модуля, который позволяет делать именно то, что вы имеете в виду. Смотрите live-plugin-manager.

вы можете установить и запустить практически любой пакет из NPM, Github или из папки.

вот пример:

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();

В приведенном выше коде я установить moment пакет во время выполнения, загрузить и выполнить его. В конце я удаляю его.

внутренне я не работать npm Икс, а на самом деле скачать пакет и запустить внутрь узла виртуальной машины песочница.

pacote - это пакет, который npm использует для извлечения метаданных пакета и tarballs. Он имеет стабильный, публичный API.