1

似乎 NPM 包以及扩展名 nodejitsu 不喜欢我的 node_modules 文件夹。:*(

我目前正在构建一个网络应用程序。

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

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 也忽略了它们,我无法启动我的网络应用程序。

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

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

如您所见,我尝试使用 bundleDependencies 告诉 NPM Pack 我正在尝试包含一些 node_modules 文件夹(模块?),但 pack 仍然忽略所有这些...此外,如果我在“依赖项”下包含任何内容, NPM start 在根目录创建一个新的 (??) node_modules 文件夹...但是在根目录中不需要 node_modules... 正如您所看到的在服务器文件夹中使用了 node_modules。

如何让 NPM Pack 识别所有 node_modules 文件夹中的文件和文件夹并正确打包它们?

4

1 回答 1

5

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

我很难理解您的应用程序结构。我想我明白你想要做什么。从https://npmjs.org/doc/folders.html开始,它实际上详细介绍了子模块何时以及为什么会出现或不会出现。

在本地安装时,npm 首先尝试找到合适的前缀文件夹。这样 npm install foo@1.2.3 就会安装到你的包的合理根目录,即使你碰巧cdd到了其他文件夹。

从 $PWD 开始,npm 将遍历文件夹树,检查包含 package.json 文件或 node_modules 文件夹的文件夹如果找到这样的东西,那么为了运行 npm commands,它将被视为有效的“当前目录”。(在工作目录中运行 git 命令时,此行为受到 git 的 .git-folder 搜索逻辑的启发并与之类似。)

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

当你运行 npm install foo@1.2.3 时,包会被加载到缓存中,然后解压到 ./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 副本放入.../baz/node_modules,因为当它调用 require("bar") 时,它会得到安装在foo/node_modules/bar.

node_modules仅当将在多个嵌套文件夹中安装完全相同的版本时才使用此快捷方式。a/node_modules/b/node_modules/a如果两个“a”包是不同的版本,仍然有可能。但是,如果不多次重复完全相同的包,将始终防止无限倒退。

至于 bundledDependencies:

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

我认为这意味着它只会将列出的模块./node_modules/特定的子模块捆绑在一起./package.json。然后当然如上所述,它再次递归地遍历目录树......所以如果它package.json在这个目录中看到另一个文件,npm 将查看它是否有任何捆绑的 deps 包含在包中。

因此,据我所知,由于您的基本目录中没有包,因此 package.json 中的捆绑依赖项不会做任何事情,实际上在 bundledDependencies 字段中包含项目弊大于利。

要修复,您需要编辑package.json文件以在每个级别包含这些捆绑包。

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

据我了解,您的文件结构是这样的:

    应用程序
    +-- 引擎
    +-- 服务器
    | +-- 套接字.io
    | | `-- 包.json
    | | +-- 节点模块
    `-- 自述文件.md
    `-- 包.json

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

至于Socket.io-client没有被打包,那是因为它是 socket.io 的依赖项。

如果我要为您建议一种让您自己更轻松的方法,我建议您在您的主要顶级package.json文件中包含您的应用程序所需的依赖项@您需要的特定版本。如果您出于某种原因需要捆绑它们,请将它们添加到捆绑部分,如果您需要与作者预期不同版本的子模块。考虑创建一个名为packageor的文件夹vendor,然后将模块放在那里,您可以在其中编辑package.json并将它们的依赖项捆绑到您的心脏内容中。请确保不要忽略您vendorpackages目录下的任何文件或文件夹.npmignore.gitignore文件。

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

我希望这能澄清事情。

于 2012-08-10T20:15:49.893 回答