node.js - 根据引擎使用不同版本的npm依赖

标签 node.js npm

我需要根据 Node 引擎指定不同版本的依赖项。像这样:

{
  "node": {
    "0.10.x": {
      "zombie": "2.5.1"
    },
    "0.12.x": {
      "zombie": "^3.5.0"
    }
  },
  "iojs": {
    "^3.0.0": {
      "zombie": "^4.0.0"
    }
  }
}

这是内置的还是有一个模块可以实现这种功能?

最佳答案

“是的,但是……”

不是内置的,但可能。

明智的做法是什么? ...

:)

// simplifying for the answer, only looking at node versions...

var npm = require("npm");
var semver = require("semver");

if (semver.satisfies(process.version, "0.12.x")){
    npm.load(null, function(){
        installPkg("chalk", "0.5.1");
    })
}

function installPkg(pkg, ver) {
    if(require.resolve(pkg)){
        throw Error("package already installed");
    }
    var semverPkg = pkg + "@" + ver;
    npm.commands.install([semverPkg], function (err, result) {
        if (err) console.log("error loading chalk");
    });
}

以编程方式使用 NPM 有点令人沮丧,因为它没有很好的文档记录。当其他人为您完成所有工作时,Semver 非常酷,但构建比较/满足检查是一项乏味的工作。

此外,这样做,您可能不想每次都尝试安装,因此您现在还必须进行某种启动检查,以确保您不会因为它每次都重新安装每个包..

您可以通过检查模块来解决这个问题。如果您决定继续沿着这条路走下去,有几种方法可以解决这个问题。

首先,您可以使用 require.resolve()以粗暴的方式查看模块是否存在。 (这就是上面示例中的内容。)

其次,你还可以使用npm.commands.ls看起来有点像这样:

if (semver.satisfies(process.version, "0.12.x")){
    npm.load(null, function(){
        npm.commands.ls([], function(err, data,lite){
            // parse the results from ls here, and install or not, etc...
            console.log(lite);
        });
    })
}

所以是的...这在技术上不是问题的解决方案,因为问题范围很广。 (不是钓鱼让你接受,只是解释说我感受到你的痛苦并且一直在走类似的路,这就是我之前详细探索 semver 和 npm 的原因。)

痛苦的部分:

  • 使用 semver 进行解析很“有趣”
  • 按 Node 版本维护模块 list 很“有趣”
  • 以编程方式使用 npm 很“有趣”

对比:

  • 维护几个不同的 package.json 版本
  • 编写一些“DevOps”脚本来为您处理特定于环境的安装(grunt-node-version?)
  • 花更少的时间查看 npm、semver 等的源代码...

关于node.js - 根据引擎使用不同版本的npm依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235414/

相关文章:

reactjs - 无法解析模块 `react-native/Libraries/ART/ReactNativeART`

Laravel Mix 不组合样式

javascript - 1 :1 error Parsing error: Unexpected character '�'

javascript - 将现有的 JavaScript 项目导入 Grunt/Brunch 项目

javascript - 在node.js中解析JSON对象

javascript - 如何使用 NodeUnit 测试客户端代码

node.js - npm 将模块安装到主目录

python - 用 tcl 编写的 irc bot 与 python/node.js 克隆相比如何?

node.js - 使用专用 'connection' 范围之外的套接字

javascript - 如何在 Windows 上安装 n?