我找到了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
模块解决方案。
答案 0 :(得分:15)
NPM NodeJS API没有详细记录,但检查代码会有所帮助。
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 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."
我的问题与版本有关,因此我们可以:hello-world@0.0.1
安装0.0.1
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);
});
});
我没有测试,但我确信我们可以使用任何格式的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;
}
答案 1 :(得分:8)
答案 2 :(得分:2)
我是模块的作者,允许你做你想到的。 请参阅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");
答案 3 :(得分:1)
当我编写具有依赖项的应用程序时,我使用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 install的文档。 https://npmjs.org/doc/cli/npm-install.html
我一直无法挖掘您特定案例的任何其他具体信息,也许没有方法可以通过编程方式按版本安装,但这没有意义,它必须是可行的。