Установите программно пакет NPM, обеспечивающий его версию
Я нашел как программно установить пакеты npm, и код работает нормально:
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
.
Ответы
Ответ 1
API NPM NodeJS плохо документирован, но проверка кода помогает.
Здесь мы находим следующую строку:
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;
}
Ответ 2
Поскольку я делаю такой вид implem LOT для своей работы, я написал простой, но эффективный модуль nodeJS для легкого управления процессом.
Github-хранилище npmi
или
npm install npmi
Ответ 3
Когда я пишу приложение с зависимостями, я использую файл package.json и включаю его в каталог с моим приложением. Кажется, это немного похоже на это.
{
"name": "MyApp",
"description": "My App.",
"version": "0.0.1",
"dependencies": {
"express": "3.4.3",
"socket.io": "0.9.16"
}
}
Я думаю, вы можете использовать аналогичный формат для установки с помощью NPM из командной строки. С package.json вы просто устанавливаете npm install -d (предполагая, что -d обозначает "зависимости" )
Речь идет о том, чтобы делать это программно. Вы пробовали просто добавить второй аргумент вроде ( "npm @version #" )?
Если бы я делал это программно, я мог бы попробовать что-то вроде этого:
var pjson = require('./package.json');
Таким образом, я могу поддерживать контроль версий и использовать простоту файла package.json.
Я добавил дополнительную информацию в комментарии, если вы еще не посмотрели, вот документы для установки npm. https://npmjs.org/doc/cli/npm-install.html
Я не смог выкопать какую-либо другую конкретную информацию в вашем конкретном случае, возможно, нет никакого способа для установки по версии программно, но это не имеет смысла, это должно быть выполнимо.
Ответ 4
Я являюсь автором модуля, который позволяет делать то, что вы имеете в виду.
См. 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, но фактически загружаю пакеты и запускаю в изолированной программной среде node.
Для установки конкретной версии просто используйте:
await manager.install("moment", "2.20.1");