在节点项目源代码控制中如何存储npm模块

好吧,我有一个奇怪的情况。 我有一个节点应用程序将被传递到无法访问互联网的系统。 我有我的所有代码在我的package.json文件中,但是当我提供服务器时,我无法运行npm install。

目前,node_modules目录正在被检入到SVN中。 到目前为止,我讨厌这个,因为每次我需要获得一个新版本的模块,我已经从SVN删除整个模块,安装较新的版本,将其添加到SVN和签入。

其他选项我有关于具有某种构buildnpm安装时,打包节点应用程序交付。 也许从SVN中检查出来,npm安装并创build必要的tarball或rpm。

过去我曾经使用过“捆绑器”作为ruby,这是相当不错的,因为你只需要把所有的代码都放在另一个目录中,这样就可以在这些代码中取得成功。 如果您处于离线状态,则效果很好 任何像这样的节点?

在寻找类似的答案时,我发现这篇文章是关于为什么在源代码pipe理中保留完整的node_modules

git中的node_modules

虽然从2011年12月10日开始,但今天可能会有些过时。

更新 :在2014年1月,将所有node_modules存储在源代码pipe理中的build议仍然适用。

有一个叫做shrinkpack的CLI,可以帮你pipe理这个。

它通过读取由npm shrinkwrap shrinkwrap生成的依赖关系图并为每个依赖关系(和子依赖关系)重新指定https:// urls来指向工程中的node_shrinkwrap目录中的tarball。

node_shrinkwrap目录包含与npmregistry中npm install下载完全相同的.tgz文件,因为npm-shrinkwrap.json文件存在(由npm shrinkwrap shrinkpack创build并由shrinkpack更新)– npm install知道使用find的tarball安装而不是通过networking传递给npmregistry。

 npm install -g shrinkpack 

我也面对一个类似的部署场景,而我在search这个解决scheme时依赖于使用make(unix工具)并编写自己的Makefile。 Makefile是一个文本文件,它遵循特定的格式,并在其中创build目标,例如:test,publish,install ..每个目标是从命令行调用时运行的一段Bash代码,例如:'make publish '或者你可以把它们连在一起,就像'做testing发布'一样。

所以,在我的场景中,我有一个“testing”目标执行我的testing,然后我有一个“发布”目标,做几个像调用'npm install'然后'npm修剪'(删除旧的npm依赖关系,我停止使用)。 然后,“发布”通过将文件夹的gzip压缩到一个单独的位置完成,然后将代码推送到内部networking位置,我的生产服务器可以从该网站下载并解压缩。 所有的node_modules代码都放在zip文件中。 在生产服务器上,操作团队提取gzip,然后调用“make start”。 “开始”只是设置任何环境variables并启动我的节点应用程序的另一个目标。

总结一下,我在源代码控制中有我的node_modules,我发现makefile是非常可定制的,所以它适合于不同需求的不同项目,但是您可以在目标命名上保持一个约定,工作人员和DevOpstesting/发布/安装您的应用程序。

问候,路易斯。