为什么“npm搜索”提供的结果不完整?

时间:2017-11-15 13:23:59

标签: npm

我注意到,使用npm search命令并不能保证完整的结果。这是一个例子:

$npm search jasmine

未列出jasmine-diffjasmine-diff-reporter个包,而

$npm search jasmine diff

确实

我读过the doc,并没有提到任何不完整性,确实是

  

npm搜索执行...搜索注册表中所有文件的包元数据

我认为,这在某种程度上意味着,搜索应该是一致和完整的。正如人们可以看到jasmine-diff-reporter软件包在其关键字中确实使用了 jasmine 一词:

an npm search incomplete results showcase image

并不重要,在描述部分中没有单词 jasmine ,因为像jasmine-diff这样的其他软件包具有该字,但在$npm search jasmine输出中仍然缺少

那么有人能以某种方式解释这种行为和/或建议一种解决方法(除了使用谷歌或类似的东西)?

1 个答案:

答案 0 :(得分:1)

问题是在https://github.com/npm/npm/commit/e3229324d507fda10ea9e94fd4de8a4ae5025c75中实现的针对“ npm search”的新“快速端点搜索”。我已经注册了一个错误:https://github.com/npm/cli/issues/1211

我研究了npm脚本,发现旧搜索使用URL https://myNpmServer.com/repository/myNpmRegistry/-/all来获取软件包信息,而新搜索使用https://myNpmServer.com/repository/myNpmRegistry/-/v1/search?text=%2F。*%2F&size = 20。该值“ 20”是硬编码的,但是您可以使用“ npm search”的-searchlimit = N 参数对其进行更改,这是最简单的解决方法。

唯一的问题是您永远都不知道搜索结果如何。没有值表示“无穷大”(我试图通过-1,但没有用)。如果您确实需要完整搜索,则可以拒绝“ npm search”并直接解析https://myNpmServer.com/repository/myNpmRegistry/-/all的JSON输出,也可以修改文件 /lib/node_modules/npm/lib/search.js并添加您自己的参数--oldsearch:

if (npm.config.get('oldsearch')) {
  allPackageSearch(searchOpts).on('data', function (pkg) {
    entriesStream.write(pkg)
  }).on('error', function (e) {
    entriesStream.emit('error', e)
  }).on('end', function () {
    entriesStream.end()
  })
} else {
  esearch(searchOpts).on('data', function (pkg) {
    entriesStream.write(pkg)
    !esearchWritten && (esearchWritten = true)
  }).on('error', function (e) {
    if (esearchWritten) {
      // If esearch errored after already starting output, we can't fall back.
      return entriesStream.emit('error', e)
    }
    log.warn('search', 'fast search endpoint errored. Using old search.')
    allPackageSearch(searchOpts).on('data', function (pkg) {
      entriesStream.write(pkg)
    }).on('error', function (e) {
      entriesStream.emit('error', e)
    }).on('end', function () {
      entriesStream.end()
    })
}).on('end', function () {
  entriesStream.end()
})

此后,您可以说“ npm search -oldsearch --registry ...'/ regexp /'”,它必须显示所有软件包。

附加说明(很高兴知道): 请注意,在Node安装中使用.js脚本进行操作(在其中添加打印输出等)期间,您会收到错误消息

npm ERR! invalid value written to input stream

在那之后,某些东西坏了,“ npm search”完全停止工作或显示很少的输出。为了修复此问题,只需继续添加其他打印输出,直到再次出现上述消息失败。然后下一次运行(仅一次),您将看到以下消息:

npm WARN all-package-metadata cached-entry-stream Empty or invalid stream
npm WARN Failed to read search cache. Rebuilding
npm WARN Building the local index for the first time, please be patient

,它再次返回到正确的状态。我没有进一步调查为什么会发生这种情况,也没有找到强制使此搜索缓存无效的方法。

我希望我的调查对某人有帮助。