NPM Pack / Nodejitsu忽略掩埋的Node_modules文件夹

看来,NPM包,扩展名,nodejitsu,不喜欢我的node_modules文件夹。 :*(

我目前正在构build一个Web应用程序。

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

Engine(folder) Server(folder) readme.md package.json 

(多个文件夹)(文件夹)(文件夹)node_modules(文件夹)

  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) 

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

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

就好像NPM包完全忽略了那些node_modules文件夹。 (比如socket.io下面的那个)。

由于NPM包忽略了这些npm文件夹的事实,jitsu也忽略了它们,我无法启动我的web应用程序。

如何获得NPM pack / nodejitsu正确打包所有node_modules文件夹?

我目前的根目录下的package.json文件如下所示: http : //pastebin.com/SAU6rwb5

正如你所看到的,我试图使用bundleDependencies来告诉NPM Pack,我试图包含一些node_modules文件夹(模块?),但是pack仍然忽略了所有这些…另外,如果我在“dependencies”下包含任何东西, NPM start会在根目录下创build一个新的(??)node_modules文件夹…但是在根目录下,什么都不需要node_modules …正如您所看到的,node_modules在服务器文件夹内部使用。

如何获得NPM Pack来识别所有node_modules文件夹中的文件和文件夹并将其正确打包?

(如果你想要一个真正简单的解决scheme,跳转到最后一段)

我很难理解你的应用程序结构。 我想我得到你想做的事情。 从https://npmjs.org/doc/folders.html ,它实际上会详细介绍子模块何时以及为什么会显示或不显示。

在本地安装时,npm首先尝试查找适当的前缀文件夹。 这样npm install foo@1.2.3将安装到你的软件包的明智的根目录,即使你正好碰到了其他文件夹。

从$ PWD开始,npm将遍历文件夹树, 检查包含package.json文件或node_modules文件夹的文件夹 。 如果发现这样的事情,那么为了运行npm命令 ,将其视为有效的“当前目录” 。 (这个行为受git的.git文件夹寻找逻辑的启发,类似于在工作目录中运行git命令时的逻辑。)

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

当你运行npm install foo@1.2.3时,程序包被加载到caching中,然后解包到./node_modules/foo中。 然后,任何foo的依赖类似地被解压到./node_modules/foo/node_modules / ….

熊与我的另一个报价…

使用节点模块系统的属性来处理循环,它会遍历寻找node_modules文件夹的目录。 所以,在每个阶段,如果一个包已经安装在一个祖先的node_modules文件夹中,那么它不会被安装在当前位置。

考虑上面的情况, foo -> bar -> baz 。 想象一下,除此之外, baz依赖bar ,所以你会有: foo -> bar -> baz -> bar -> baz ... 然而,由于文件夹结构是:foo / node_modules / bar / node_modules / baz,所以不需要在bar / bar / node_modules中添加另一个bar的副本,因为当它调用require(“bar”)时,它会得到在foo/node_modules/bar安装的副本。

只有在多个嵌套的node_modules文件夹中安装完全相同的版本时才会使用此快捷方式。 如果两个“a”包是不同的版本,仍然可能有a/node_modules/b/node_modules/a但是,如果不多次重复完全相同的程序包,总会阻止无限的回归。

至于捆绑的依赖关系:

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

我认为这只是./node_modules/ 列出的模块./node_modules/特定子模块./package.json 。 那么当然就像上面所写的那样,它recursion地遍历目录树…所以如果它看到在这个目录中的另一个package.json文件,npm会查看是否有任何捆绑包含在包中。

所以,现在我明白了,因为你的基目录没有包,你捆绑在package.json中的依赖不会做任何事情 ,而且实际上在你的bundledDependencies域里有项目会带来更多的伤害。

为了解决您的问题,您需要编辑package.json文件以在每个级别包含这些软件包。

我以前有过这个问题,当试图得到一个打包的解包meteor应用程序在nodejitsu工作。 我以不同的方式解决了这个问题。 在我的应用程序的根文件夹中,我包含了所有顶级节点模块,并在我的package.json文件中明确地设置了它们的版本。

从我的理解你的文件结构是这样的:

    应用
     +  - 引擎
     +  - 服务器
     |  +  -  socket.io
     |  |  ` -  package.json
     |  |  +  -  node_modules
     ` -  readme.md
     ` -  package.json

如果是这样,那么你需要编辑socket.io下的package.json ,以包含你想要的捆绑代码。 一般来说,虽然你可以信任包维护者保持有效的版本(但在这种情况下,你不能?)

至于没有被封装的Socket.io-client ,它是socket.io的一个依赖。

如果我想build议一种方法让你更容易,那么我build议你在你的主要顶层package.json文件中包含你需要的依赖项@你需要的特定版本。 如果您因为某种原因需要将它们捆绑在一起,请将它们添加到捆绑的部分,如果您需要的子模块的版本不同于作者的预期。 考虑制作一个名为packagevendor的文件夹,然后将模块放在那里,在那里你可以编辑package.json并把它们的依赖关系捆绑到你的内容中。 请确保您不要忽略使用.npmignore.gitignore文件的vendorpackages目录下的任何文件或文件夹。

另外,如果这太难了(编辑所有这些文件并指定某些版本可能会很痛苦),我build议您将供应商软件包托pipe在一些可以使用脚本下载它们的地方,然后在postinstall部分中执行此脚本你的package.json(阅读https://npmjs.org/doc/scripts.html …你可以在同一部分添加你的“开始”脚本。

我希望澄清事情。