Npm安装过程中“无法读取未定义的属性'match'”

时间:2019-10-16 01:30:40

标签: node.js npm

我在构建Jenkins时遇到错误

Jenkins日志

  
    

任务:api:processResources     任务:api:classes     任务:web:nodeSetup     任务:web:npmSetup /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/bin/npm     -> /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/lib/node_modules/npm/bin/npm-cli.js     /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/bin/npx     -> /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/lib/node_modules/npm/bin/npx-cli.js     + npm@6.11.2在6.837s中添加了832个贡献者的430个软件包     任务:web:npm安装失败npm错误!无法读取未定义的属性“匹配”

  
     

npm错误!有关此运行的完整日志,请参见:npm ERR!
  /var/lib/jenkins/.npm/_logs/2019-10-16T01_11_20_594Z-debug.log

     

失败:构建失败,并出现异常。

     
      
  • 出了什么问题:任务':web:npmInstall'的执行失败。

         
        

    处理'command'/var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/bin/npm''     以非零退出值1结束

      
  •   
  • 尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。使用--scan运行以获取完整的见解。

  •   
  • https://help.gradle.org

  • 获得更多帮助   
     

在此版本中使用了不推荐使用的Gradle功能,因此   与Gradle 6.0不兼容。使用'--warning-mode all'来显示   个别弃用警告。看到   https://docs.gradle.org/5.0/userguide/command_line_interface.html#sec:command_line_warnings

     

在33秒内失败

/var/lib/jenkins/.npm/_logs/2019-10-16T01_11_20_594Z-debug.log

17傻saveTree│├─┬clean-css@4.2.1 17 silly saveTree││└──source-map@0.6.1 17傻saveTree│├──指挥官@ 2.17.1 17 silly saveTree│└──he@1.2.0 17傻的saveTree└─┬loader-utils@0.2.17 17傻saveTree├──big.js@3.2.0 17傻saveTree├──emojis-list@2.1.0 17傻saveTree└──json5@0.5.1 18详细堆栈TypeError:无法读取未定义的属性“ match” tarballToVersion上的18个详细堆栈(/usr/local/lib/node_modules/npm/lib/install/inflate-shrinkwrap.js:87:20) 可充气儿童处的18个详细堆栈(/usr/local/lib/node_modules/npm/lib/install/inflate-shrinkwrap.js:99:22) BB.each上的18个详细堆栈(/usr/local/lib/node_modules/npm/lib/install/inflate-shrinkwrap.js:55:12) tryCatcher上的18个详细堆栈(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/util.js:16:23) 18个详细的堆栈位于Object.gotValue(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/reduce.js:155:18) Object.gotAccum上的18个详细堆栈(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/reduce.js:144:25) Object.tryCatcher上的18个详细堆栈(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/util.js:16:23) Promise._settlePromiseFromHandler(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:512:31)上的18个详细堆栈 Promise._settlePromise(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:569:18)上的18个详细堆栈 Promise._settlePromiseCtx上的18个详细堆栈(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:606:10) _drainQueueStep处的18详细堆栈(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:142:12) _drainQueue上的18详细堆栈(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:131:9) Async._drainQueues上的18个详细堆栈(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:147:5) 在Instant.Async.drainQueues(/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:17:14)上的18个详细堆栈 runCallback上的18个详细堆栈(timers.js:810:20) tryOnImmediate上的18个详细堆栈(timers.js:768:5) 19详细的cwd / var / lib / jenkins / workspace / hds_v2_docker / web 20详细Linux 4.4.0-59-generic 21详细argv“ / usr / bin / node”“ / usr / local / bin / npm”“安装” 22详细节点v8.16.0 23详细npm v6.9.0 24错误无法读取未定义的属性“匹配” 25详细出口[1,true]

5 个答案:

答案 0 :(得分:18)

您必须同时删除 package-lock.json node_modules/

如果您不删除两者,则问题将再次出现在下一个npm install上。

答案 1 :(得分:6)

尝试删除package-lock.json看看是否有帮助。

rm -rf package-lock.json

答案 2 :(得分:2)

在仓库中运行npm install时,我遇到了相同的错误。我没有使用Jenkins,但是我发现了一种在NPM中调试(最终解决)该问题的通用方法。

  1. 打开cli为您提供的npm调试日志文件。 (在Windows上,默认情况下位于C:\Users\USERNAME\AppData\Roaming\npm-cache\_logs下)
  2. 在文件底部查找错误的堆栈跟踪。
  3. 错误堆栈跟踪的前三行应类似于:
18 verbose stack TypeError: Cannot read property 'match' of undefined
18 verbose stack     at tarballToVersion (C:\Users\USERNAME\AppData\Roaming\nvm\v14.5.0\node_modules\npm\lib\install\inflate-shrinkwrap.js:87:20)
18 verbose stack     at inflatableChild (C:\Users\USERNAME\AppData\Roaming\nvm\v14.5.0\node_modules\npm\lib\install\inflate-shrinkwrap.js:113:22)
  1. 打开inflate-shrinkwrap.js文件,然后转到上面的堆栈跟踪行#3中列出的行。
  2. 添加以下调试代码:(恰好在[stack-trace]中调用tarballToVersion的行之前)
if (sw.version == null) {
    console.error(`
        NPM is trying to retrieve package "${name}" with version "undefined"!
        Package location: ${(onDiskChild || {}).location}
        Package parse error:`, (onDiskChild || {}).error);
}
  1. 运行npm install(或任何产生此错误的命令)。您应该看到这样的输出:
        NPM is trying to retrieve package with version "undefined"!
        Package location: /firebase-feedback/webpack-dev-middleware
        Package parse error: [Error: ENOENT: no such file or directory, open 'C:\Root\Apps\@V\@Modules\firebase-feedback\Main\node_modules\webpack-dev-middleware\package.json'] {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Root\\Apps\\@V\\@Modules\\firebase-feedback\\Main\\node_modules\\webpack-dev-middleware\\package.json'
}
  1. 转到内部错误中指定的路径。您应该发现该路径上的package.json文件确实丢失了。
  2. 按您认为合适的方式解决该潜在的“ package.json”问题。 (对我来说,这是通过删除C:/Root/Apps/@V/@Modules/firebase-feedback/Main/node_modules文件夹,然后在npm install文件夹中运行Main来完成的)

请注意,在我的情况下,(缺少的package.json文件)潜在的问题似乎是由我意外地从父项目(使用我的npm install库)运行firebase-feedback引起的,而我的图书馆“已链接npm”。

我通常使用npm-safe-install来避免这类问题(使用npm link时),但是我一定是最近一段时间忘记了–导致NPM处理npm链接库的{{1} }文件夹。

node_modules相关的类似问题以前已经发生过,但是我希望NPM到现在可以解决这类问题。显然不是;尽管NPM版本7已被声明将在该领域进行重写,所以希望可以长期解决。

答案 3 :(得分:1)

您必须删除项目Package-lock.json文件。然后尝试安装所需的内容。

You can find that file in main project directory

答案 4 :(得分:0)

该错误可能会随其抛出的npm内部文件而有所不同! (我想知道所有可能的原因)!而且应该是一个错误!

(在我的最后一种情况中:它位于npm文件[_canPlaceDep]的{​​{1}}方法上!

注意

如果所有常用方法都不起作用!并且您正在使用 nodejs v15 + 最新npm版本之一!转到最后一部分!我称之为nodejs 版本地狱的问题! (注意:经过反思!对于npm来说,它可能不是一个地狱版本!请阅读)

如何解决

删除node_modules

build-ideal-tree.js

之后重新安装

\rm -r node_modules

(注意:可能仍然无法使用)

您也可以尝试删除package.lock!

清除缓存

npm install

如果缓存以某种方式损坏,那可以工作!但是常见的错误更多是npm cache clean --force

您可以在此处查看我的答案(解释得很好):https://stackoverflow.com/a/52249619/7668448

删除package.lock(不建议)

Unexpected end of JSON input while parsing near ...

为什么不建议

来自@DanielIM评论

不,不应该。这是“建议的解决方法”,但在实践中令人难以置信。在package.json中拥有锁定的依赖关系绝不能确保依赖关系的依赖关系保持一致,因此,删除package-lock.json文件,安装npm并生成新的锁定文件*将允许那些子依赖关系发生改变,而这通常会完全改变破坏任何未来的建筑。使用现有的锁定文件通常是维护构建的唯一方法(毕竟这是文件的要点),因此完全删除它与存在的原因背道而驰。

因此,通常把它留作最后的选择会很好!如果不起作用!您也可以尝试删除node_modules

重新安装nodejs或NPM

npm级别可能会发生问题!尝试重新安装可能是一个不错的方法!

要在重新安装的地方进行快速测试!使用NVM(nodejs版本管理器)并切换到另一个版本既快速又有趣!因为我们也可以测试版本问题

如果在切换后仍然有效!然后或者是npm的问题,重新安装可能会解决它!或者这是版本地狱问题(错误)!

如何快速重新安装!再次使用nvm!

rm package.lock

然后

nvm uninstall v15

然后使用它

nvm install v15

您可以仅安装另一个版本并使用它! (例如v14)

检查版本问题,以及如何使用nvm在版本之间进行切换!

不常见或新!版本地狱

今年!我遇到了许多nodejs 版本问题! (我喜欢这样称呼他们)(因为我给他们起了个名字!天空给我更多的祝福)(讽刺)

要快速列出它们:

  • 节点v14地狱(POSTGRES),并导致 pg 模块(postgres)出现问题[由于重大更改!该pg取决于!](如果您使用的是 knex 或任何orm或查询生成器!并将其与postgres一起使用!您将遇到它的机会很大!如果您仅升级nodejs版本![解决方案:将pg versoin升级到最新版本(> = 8.0.3)[他们已修复](可以在https://stackoverflow.com/a/64639717/7668448处查看完整的详细说明)]
  • 打字稿v4地狱!类似的问题!我的项目之一中的打字稿在内部因nvm use v15 而失败!回滚到 v3.9 成功运行!没问题!

解决我们的问题(cannot read property "" of undefined

如果您正在使用节点v15 !尝试使用节点v14 (npm v6.14.8)!就是这样!一个npm错误!这是第一个想法!那是我最初的想法!

对我来说就是这样!在最后一个问题中!我尝试了所有我熟悉的解决方案!而且它们也已经在这里列出!没有一个工作!当我删除 node_modules 时,还有更多!我是Cannot read property 'matches' of undefined!而且就是这样!它与Please not another version HELL一起使用效果很好。提示[BUG]。

然后反思一下!就像嘿!当我更改版本时!我正在使用另一个nodejs安装!哪有没有问题。 npm结构或某些问题以及重新安装可能会解决该问题(如上所述)!

之后!我尝试了**node v14** (npm v6.14.8)。而且一切正常!安装完成后就可以了!我回到了节点v15.0.1!它再次起作用!因此,问题绝对不是 VERSION HELL问题

我仍然无法解释发生了什么!但总之!使用 NVM !尝试其他版本!是解决它的好方法!您也可以快速重新安装当前版本!

大撤消(针对版本地狱)

从nodejs v14开始!和v15!或者只是一般!对此版本持怀疑态度真是太好了!这更多是没有意义的原因!这就是所有问题,而不仅仅是npm! VERSIONS HELL 问题太多了!我遇到了2到现在!收到 VERSIONS HELL 的提醒可以节省您很多时间!

如何快速测试以及如何快速切换nodejs版本

要快速测试并检查!主要是为了解决任何内部错误!我将快速谷歌!然后尝试使用其他版本的nodejs 任何有问题的内容(例如:打字稿)!我也可以调试(console.log)引发错误的内部文件!并尝试找出答案!

但是就是这样! 检查其他版本真的很有趣! (nodejs,打字稿,... [请记住对此表示怀疑或警告])

对于nodejs要快速做到:

NVM快速切换Node.js版本(npm)

使用 NVM (nvm是node.js的版本管理器)

在NVM中快速安装版本

node v15.3.0

快速切换到另一个节点版本

nvm install v14

(检查文档以获取详细信息!并确定安装过程)

用于切换和测试某些npm模块版本(例如:打字稿)

如果是cli工具!您可以全局安装精确版本

nvm use v14

使用npm i -g typescript@3.9 语法!

验证和测试后,您可以切换回任意状态!

如果在项目中!您可以做同样的事情(不是全局的)!使用@语法来精确定义版本!

@

或保存

npm i moduleName@<versionSpecifier>

版本说明符使用 SEMVER 约定(https://semver.org/)。

最后一个提示(在脚本中使用npx)

设置项目内部的版本很好!例如

npm i moduleName@<versionSpecifier> --save

在脚本中,我使用npx:

"devDependencies": {
    "@types/cors": "^2.8.6",
    "@types/gulp": "^4.0.6",
    "cross-env": "^6.0.3",
    "glob": "^7.1.6",
    "gulp": "^4.0.2",
    "nodemon": "^2.0.4",
    "ts-node": "^8.10.2",
    "typescript": "^3.9.7", // <===== Typescript version 3.9 (for this project)
    "jest": "^26.6.3"
  }

当我们通过nodjes模块cli工具以这种方式使用npx时! npx将首先检查该模块是否在本地node_modules中可用!如果找到将使用它(否则使用全局,或下载最新版本并运行)!

所以按照我的建议做吧!将确保您的项目将独立于全局运行而独立运行!

(如果您不太了解该工具,请阅读有关npx的更多信息)