NodeJS包混淆

时间:2018-06-07 04:46:00

标签: javascript node.js npm

在我的package.json文件中,我有:

  "devDependencies": {
    "chai": "^4.1.2",
    "chai-as-promised": "^7.0.0",
    "chai-bignumber": "^2.0.0",
    "decimal.js": "^10.0.0",
    "ethereumjs-testrpc-sc": "6.1.2",
    "ganache-cli": "6.1.0",
    "solidity-coverage": "0.4.14",
    "truffle": "4.1.3"
  }

我创建了一个NodeJS脚本文件getWeb3Version.js

let web3 = require("web3");
console.log(web3.version);

当我在node getWeb3Version.js之前运行npm install时,我得到1.0.0-beta.30

当我在node getWeb3Version.js之后运行npm install时,我得到undefined

为了更深入地进行调查,我将console.log(web3.version)更改为console.log(web3),web3之后的npm install对象似乎是{web3的一小部分1}} npm install之前的对象。

为了进行更深入的调查,我从项目文件夹(npm list --depth=0文件所在的位置)的内部和外部调用了package.json

当我从项目文件夹中调用npm list --depth=0时,我得到了这个:

+-- chai@4.1.2
+-- chai-as-promised@7.1.1
+-- chai-bignumber@2.0.2
+-- decimal.js@10.0.0
+-- ethereumjs-testrpc-sc@6.1.2
+-- ganache-cli@6.1.0
+-- solidity-coverage@0.4.14
`-- truffle@4.1.3

正如您所看到的,web3甚至不存在(这很明显,因为我不会在我的package.json文件中导入它。)

尽管如此,require("web3")似乎也有效,正如问题开头所提到的那样。

当我从项目文件夹外部调用npm list --depth=0时,我明白了:

+-- chai@4.1.2
+-- decimal.js@9.0.1
+-- ethereumjs-testrpc-sc@6.0.7
+-- ganache-cli@6.1.0
+-- log4js@2.5.2
+-- pug@2.0.0-rc.4
+-- solc@0.4.19
+-- solidity-coverage@0.4.14
+-- solidity-parser-sc@0.4.4
+-- sprintf-js@1.1.1
+-- testrpc@0.0.1
+-- truffle@4.1.7
`-- web3@1.0.0-beta.30

后跟一串以npm ERR! extraneous:开头的行。

有人可以解释一下究竟发生了什么吗?

我的package.json文件中导入的其中一个软件包是否可能会导出我web3时看到的console.log(web3)对象的子集?

谢谢。

2 个答案:

答案 0 :(得分:1)

  

is a very small subset of the web3 object是在获得之后获得的   npm install

是因为,您安装的某个模块正在使用不同版本的web3。如果您没有执行npm install,则web3包将从web3@1.0.0-beta.30的全局包中获取。

  

这里要记住的关键是本地包覆盖   全球一揽子计划。

答案 1 :(得分:0)

如果您的依赖项中未列出该软件包,并且您仍然可以使用它,则可能是因为它是全局安装的。 您可以通过npm ls -g检查是否全局安装 与chai,ganache-cli不同,web3是一个应用程序依赖项,所以尝试在依赖项而不是dev依赖项上找到它