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文件中包含你需要的特定版本所需的依赖项.如果您因某些原因需要将它们捆绑在一起,请将它们添加到捆绑的部分中,如果您需要的子模块版本不同于作者的预期版本.考虑制定一个文件夹,名为package或vendor在那里,然后放置模块,在那些你可以编辑package.json和捆绑他们的依赖关系,你的心内容.但请确保您不会忽略您vendor或packages目录下的任何文件或文件夹.npmignore或.gitignore文件.
或者,如果这太难了(编辑所有这些文件并指定某些版本可能会很麻烦)我建议您将供应商软件包托管在哪里可以用脚本下载它们,然后在postinstall您的部分执行此脚本package.json(请阅读https://npmjs.org/doc/scripts.html ...您可以在同一部分添加这个"开始"脚本.
我希望澄清事情.
| 归档时间: |
|
| 查看次数: |
1804 次 |
| 最近记录: |