Javascript NPM Pack/Nodejitsu忽略隐藏的节点\u模块文件夹

Javascript NPM Pack/Nodejitsu忽略隐藏的节点\u模块文件夹,javascript,node.js,npm,nodejitsu,Javascript,Node.js,Npm,Nodejitsu,似乎NPM包,以及作为扩展的nodejitsu,不喜欢我的node_模块文件夹:*( 我目前正在构建一个web应用程序 我的web应用程序的项目文件夹结构如下: 根 (多个文件夹)(文件夹)(文件夹)节点_模块(文件夹) 我希望每个人都能看到这个结构好 我遇到的问题是,当我在根目录下运行NPM Pack时,除了第一个node_modules文件夹下面的所有node_modules文件夹外,整个目录结构都被正确打包 这就好像NPMPack完全忽略了那些node_模块文件夹一样(例如socket.i

似乎NPM包,以及作为扩展的nodejitsu,不喜欢我的node_模块文件夹:*(

我目前正在构建一个web应用程序

我的web应用程序的项目文件夹结构如下:

(多个文件夹)(文件夹)(文件夹)节点_模块(文件夹)

我希望每个人都能看到这个结构好

我遇到的问题是,当我在根目录下运行NPM Pack时,除了第一个node_modules文件夹下面的所有node_modules文件夹外,整个目录结构都被正确打包

这就好像NPMPack完全忽略了那些node_模块文件夹一样(例如socket.io下面的文件夹)

由于NPM包忽略了这些NPM文件夹,柔术也忽略了它们,我无法启动我的web应用程序

如何让NPM pack/nodejitsu正确打包所有节点模块文件夹

我当前根目录下的package.json文件如下所示:

如您所见,我试图使用bundleDependencies告诉NPM Pack我试图包含一些node_模块文件夹(模块?),但Pack仍然会忽略所有这些文件夹……此外,如果我在“dependencies”下包含任何内容,NPM start会创建一个新的(?)根目录中的node_modules文件夹…但是在根目录中,没有任何东西需要node_模块…正如您可以看到的,node_模块在服务器文件夹中使用

如何让NPM Pack识别所有node_模块文件夹中的文件和文件夹并正确打包?

(如果您想要一个非常简单的解决方案,请跳到最后一段)

我很难理解你的应用程序结构。我想我明白你想做什么了。 从开始,它实际上详细说明了子模块何时会出现,为什么不会出现

当在本地安装时,npm首先尝试找到一个合适的前缀文件夹foo@1.2.3将安装到软件包的显式根目录,即使您碰巧已将cded插入其他文件夹

从$PWD开始,npm将沿着文件夹树查找包含package.json文件或node_modules文件夹的文件夹。如果找到这样的文件夹,则将其视为有效的“当前目录”,以便运行npm命令。(此行为受git在工作目录中运行git命令时的.git文件夹查找逻辑启发,并与之类似。)

如果找不到包根目录,则使用当前文件夹。

运行npm安装时foo@1.2.3,然后将包加载到缓存中,然后解包到./node\u modules/foo中。然后,foo的任何依赖项都类似地解包到./node\u modules/foo/node\u modules/

请接受我的另一句话

循环使用节点模块系统的属性进行处理,该属性在目录中查找节点模块文件夹。因此,在每个阶段,如果包已安装在祖先节点模块文件夹中,则不会安装在当前位置。

考虑上面的例子,其中
foo->bar->baz
。想象一下,如果除此之外,
baz
依赖于
bar
,那么您将有:
foo->bar->baz->bar->baz…
。但是,由于文件夹结构是:foo/node\u modules/bar/node\u modules/baz,因此不需要将bar的另一个副本放入
../b>az/node_modules
,因为当它调用require(“bar”)时,它将获得安装在
foo/node_modules/bar
中的副本

只有在多个嵌套的
node\u模块
文件夹中安装完全相同的版本时,才使用此快捷方式。如果两个“a”都是“a”,则仍然可以使用
a/node\u模块/b/node\u模块/a
软件包是不同的版本。但是,如果不多次重复完全相同的软件包,则始终可以防止无限倒退。

就捆绑依赖性而言:

发布[这也适用于打包]后,npm将在node_modules文件夹中查找。如果bundledDependencies数组中没有任何项,则它们将不包括在打包tarball中

我认为这意味着它将只捆绑
/node\u modules/
中列出的模块和
/package.json
的特定子模块。当然,如上所述,它会再次递归地沿着目录树走下去……因此,如果它在该目录中看到另一个
package.json
文件,npm将查看该文件是否有h与包装中包含的任何捆绑DEP相同

因此,据我目前的理解,由于您的基本目录中没有包,因此package.json中的捆绑依赖项没有任何作用,实际上,在bundledDependencies字段中包含项弊大于利

要修复此问题,您需要编辑
package.json
文件,以便在每个级别包含这些包

我以前尝试在nodejitsu上运行一个打包后解包的meteor应用程序时遇到过这个问题。我用另一种方式解决了它。在我的应用程序的根文件夹中,我包含了所有顶级节点模块,并在我的
package.json
文件中显式设置了它们的版本

据我所知,您的文件结构如下:

app +-- Engine +-- Server | +-- socket.io | | `-- package.json | | +-- node_modules `-- readme.md `-- package.json 应用程序 +--引擎 +--服务器 |+--socket.io ||`--package.json ||+--节点_模块 `--自述文件 `--package.json 如果是这样,那么您需要编辑socket.io下的
package.json
,以包含所需的捆绑DEP。通常情况下,您可以信任包维护人员保持有效版本。(但在这种情况下,您不能?)

至于
Socket.io客户端
没有打包,这是由于它依赖于Socket.io

如果我想给你建议一个让你自己更容易的方法,我会建议你
                   easyimage,mongodb,mysql(folders)       socket.io (folder)

       node_modules(folder, NPM Pack ignores this)           node_modules(folder, NPM Pack ignores this)

                                                       Socket.io-client (folder, NPM Pack ignores this)
app +-- Engine +-- Server | +-- socket.io | | `-- package.json | | +-- node_modules `-- readme.md `-- package.json