Javascript 为什么子模块构建失败时NPM会成功?

Javascript 为什么子模块构建失败时NPM会成功?,javascript,node.js,npm,kerberos,node-gyp,Javascript,Node.js,Npm,Kerberos,Node Gyp,在使用时,我经常会遇到一些似乎毫无意义的错误——Visual Studio项目无法生成,生成工具(例如:python.exe/CL.exe)在命令行上不可用等等 我看到的一些包多次未能构建: kerberos 节点gyp bcrypt 在npm安装过程中,它们会向控制台抛出带有堆栈跟踪等的大错误消息,显然完全失败了;然而,NPM带来了“快乐如拉里”和“我的Javascript应用程序及其所有依赖项中有9次运行良好” npm安装是否使用本地计算机上可用的任何编译器递归地重新构建每个依赖项 如果

在使用时,我经常会遇到一些似乎毫无意义的错误——Visual Studio项目无法生成,生成工具(例如:python.exe/CL.exe)在命令行上不可用等等

我看到的一些包多次未能构建:

  • kerberos
  • 节点gyp
  • bcrypt
npm安装过程中,它们会向控制台抛出带有堆栈跟踪等的大错误消息,显然完全失败了;然而,NPM带来了“快乐如拉里”和“我的Javascript应用程序及其所有依赖项中有9次运行良好”

  • npm安装
    是否使用本地计算机上可用的任何编译器递归地重新构建每个依赖项

  • 如果是这样的话,考虑到即使是简单的软件包也可能有大量的依赖关系,如果没有安装完整的编程语言和编译器套件,我怎么能做任何事情呢

  • 为什么这些依赖项失败并不一定意味着我的最终项目将无法使用

  • 如果一个未能构建的依赖项是“ok”,那么为什么还要麻烦拥有这个依赖项呢


  • 我还没有找到关于这些问题的明确答案,因为在搜索诸如“npm构建失败”之类的术语时找到了大量的资源。如果这些依赖项实际上被标记为可选的,npm将成功。
    ws
    模块就是一个例子,它们对两个可编译的插件有可选的依赖关系。如果构建失败,那么
    ws
    只使用纯js回退实现


    插件有时作为可选依赖项添加的原因是,它们(通常情况下)比纯js替代项执行得更快,即使对于UTF-8验证或对缓冲区内容进行异或这样的“简单”操作也是如此。

    如果这些依赖项实际标记为可选,npm将成功。
    ws
    模块就是一个例子,它们对两个可编译的插件有可选的依赖关系。如果构建失败,那么
    ws
    只使用纯js回退实现


    插件有时被添加为可选依赖项的原因是,它们(通常情况下)的执行速度比纯js替代方案快,即使对于UTF-8验证或XOR缓存内容这样的“简单”操作也是如此;就我个人而言,我尽我所能避免模块带来严重的依赖性要求或不提供相关的捆绑-但这与npm本身无关。是的。。。但是一些普通事物有大量的依赖树;例如,创建一个空项目并安装webpack会创建一个包含149个包的树!当然,那是很多。。。但我喜欢webpack.npm并不规定模块中的内容;就我个人而言,我尽我所能避免模块带来严重的依赖性要求或不提供相关的捆绑-但这与npm本身无关。是的。。。但是一些普通事物有大量的依赖树;例如,创建一个空项目并安装webpack会创建一个包含149个包的树!当然,那是很多。。。但我喜欢webpack。我的回答直接或间接地回答了你们所有的4个问题。为了进一步说明第一个问题的答案,
    npm install
    会重新构建您的依赖关系。我注意到,自我上次发表评论以来,您在回答中添加了更多信息;然而,许多失败的包(例如和)并不仅仅是UTF8验证之类的“更快的替代品”。谢谢你的回答,但“因为它们是可选的”并不是我想要的答案。显然,“为什么它们是可选的”或“为什么插件无法生成”完全取决于实际的父包或生成失败消息。另外,
    node gyp
    目前不依赖任何插件(出于明显的原因),因此安装该插件不应试图调用任何编译器。我只是将其作为无法构建的包的一个示例(在我的经验中非常常见)。现在它失败了,
    找不到模块'nan'
    ,这意味着最新构建的
    节点gyp
    没有包含它的依赖项,但通过谷歌搜索该消息表明它太模糊,无法找到答案。我只想让我的项目建设得干净利落——这问得太多了吗?我的回答直接或间接地回答了你所有的4个问题。为了进一步说明第一个问题的答案,
    npm install
    会重新构建您的依赖关系。我注意到,自我上次发表评论以来,您在回答中添加了更多信息;然而,许多失败的包(例如和)并不仅仅是UTF8验证之类的“更快的替代品”。谢谢你的回答,但“因为它们是可选的”并不是我想要的答案。显然,“为什么它们是可选的”或“为什么插件无法生成”完全取决于实际的父包或生成失败消息。另外,
    node gyp
    目前不依赖任何插件(出于明显的原因),因此安装该插件不应试图调用任何编译器。我只是将其作为无法构建的包的一个示例(在我的经验中非常常见)。现在它失败了,
    找不到模块'nan'
    ,这意味着最新构建的
    节点gyp
    没有包含它的依赖项,但通过谷歌搜索该消息表明它太模糊,无法找到答案。我只是希望我的项目能够干净地构建——这要求太高了吗?