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
文件中包含你需要的依赖项@你需要的特定版本。 如果您因为某种原因需要将它们捆绑在一起,请将它们添加到捆绑的部分,如果您需要的子模块的版本不同于作者的预期。 考虑制作一个名为package
或vendor
的文件夹,然后将模块放在那里,在那里你可以编辑package.json
并把它们的依赖关系捆绑到你的内容中。 请确保您不要忽略使用.npmignore
或.gitignore
文件的vendor
或packages
目录下的任何文件或文件夹。
另外,如果这太难了(编辑所有这些文件并指定某些版本可能会很痛苦),我build议您将供应商软件包托pipe在一些可以使用脚本下载它们的地方,然后在postinstall
部分中执行此脚本你的package.json(阅读https://npmjs.org/doc/scripts.html …你可以在同一部分添加你的“开始”脚本。
我希望澄清事情。