2013-12-19 4 views
11

я нашел how to install npm packages programmatically и код работает отлично:Установка программно пакет НПМ обеспечения его версию

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

Если я хочу, чтобы установить первую версию hello-world пакета, как я могу сделать это в стороне NodeJS, используя npm модуль?

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

ответ

13

API NPM NodeJS плохо документирован, но проверка кода помогает.

Here мы находим следующую строку:

install.usage = "npm install" 
       + "\nnpm install <pkg>" 
       + "\nnpm install <pkg>@<tag>" 
       + "\nnpm install <pkg>@<version>" 
       + "\nnpm install <pkg>@<version range>" 
       + "\nnpm install <folder>" 
       + "\nnpm install <tarball file>" 
       + "\nnpm install <tarball url>" 
       + "\nnpm install <git:// url>" 
       + "\nnpm install <github username>/<github project>" 
       + "\n\nCan specify one or more: npm install ./foo.tgz [email protected] /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." 

Мой вопрос о версии, так что мы можем сделать: [email protected] установить 0.0.1 версию hello-world.

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

Я не проверял, но я уверен, что мы можем использовать любой формат install.usage решений.

Я написал функцию, которая преобразует объект dependencies в массив, который может быть передан в вызов функции install.

dependencies:

{ 
    "hello-world": "0.0.1" 
} 

Функция получает путь к файлу package.json и возвращает массив строк.

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; 
} 
+0

Я только что протестировал метод модуля @ version, и он действительно работает. – tremor

+1

Это замечательно, но как вы устанавливаете GLOBALLY, используя npm программно? –

+0

@cSn Проверка кода, который я нашел [этот фрагмент] (https://github.com/npm/npm/blob/a362c3f1919987419ed8a37c8defa19d2e6697b0/lib/install.js#L122-L162) - однако я не знаю, как этот код должен похоже ... Может быть, вы можете задать вопрос. –

1

Когда я пишу приложение с зависимостями, я использую файл package.json и включаю его в каталог с моим приложением. Кажется, это немного похоже на это.

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

Я думаю, вы можете использовать аналогичный формат для установки с помощью NPM из командной строки. С пакетом.json вы просто делаете npm install -d (при условии, что -d означает «зависимости»)

Речь идет о том, чтобы делать это программно. Вы пробовали просто добавить второй аргумент вроде («npm @ version #»)?

Если бы я делал это программно я мог бы попробовать что-то вроде этого:

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

Таким образом я могу поддерживать контроль версий и использовать простоту файла package.json.

Я добавил дополнительную информацию в комментарии, если вы еще не посмотрели, вот документы для установки npm. https://npmjs.org/doc/cli/npm-install.html

Я не смог выкопать любую другую конкретную информацию в вашем конкретном случае, возможно, нет способа для установки по версии программно, но это не имеет смысла, это должно быть выполнимо.

+0

Я думаю, что не было так ясно. Предположим, что я хочу установить 'express' с версией' 3.4.3'. При вызове 'install' я передаю массив строк, обозначающих имена пакетов. Что я могу передать, чтобы установить 'express 3.4.3'? –

+0

Обновленный мой ответ, я думаю, что наилучшим способом было бы использовать require ('./ package.json'); – tremor

+0

Посмотрите, как работает модуль npm. Требование файла 'package.json' не помогает. –

7

Как я делаю этот вид implem много для моей работы, я написал простой, но эффективный, модуль nodeJS легко управлять процессом.

Github repository of npmi

или

npm install npmi 
0

Я автор модуля, который позволяет делать то, что вы имеете в виду. См. 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 cli, но фактически загружаю пакеты и запускаю внутри изолированной камеры VM узла.

Чтобы установить определенную версию просто использовать:

await manager.install("moment", "2.20.1"); 
Смежные вопросы