NPM Pack/Nodejitsu忽略隐藏的Node_modules文件夹

Mav*_*rus 1 javascript node.js npm nodejitsu

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

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

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

Engine(folder)                      Server(folder)    readme.md     package.json
Run Code Online (Sandbox Code Playgroud)

(多个文件夹)(文件夹)(文件夹)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)
Run Code Online (Sandbox Code Playgroud)

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

我遇到的问题是,当我在根目录下运行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仍然忽略了所有这些...而且,如果我在"依赖项"下包含任何内容, NPM start在根目录下创建一个新的(??)node_modules文件夹...但是在根目录下没有什么需要node_modules ...因为你可以看到在服务器文件夹里面使用了node_modules.

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

小智 5

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

我很难理解你的app结构.我想我得到了你想做的事情.从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时,包将被加载到缓存中,然后解压缩到./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数组中没有任何项目,那么它们将不会包含在tar包中.

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

正如我现在所理解的那样,由于您的基本目录中没有包,因此package.json中的捆绑依赖项不会执行任何操作,并且实际上在bundledDependencies字段中包含项目弊大于利.

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

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

据我所知,您的文件结构是这样的:

    app
    +-- Engine
    +-- Server
    |   +-- socket.io
    |   |   `-- package.json
    |   |   +-- node_modules
    `-- readme.md
    `-- package.json

如果是这样,那么您需要编辑package.jsonunder socket.io以包含所需的捆绑deps.一般情况下,你可以信任软件包维护者保留有效版本.(但在这种情况下,你不能?)

至于Socket.io-client没有被打包的结果是它是socket.io的依赖.

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

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

我希望澄清事情.