2013-04-23 51 views
4

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

目前node_modules目录正被检入到SVN中。到目前为止,我讨厌这个问题,因为每当我需要获取更新版本的模块时,我都会从SVN中删除整个模块,安装更新的版本,将其添加到SVN并签入。

我有一些其他的选择是有某种形式的构建,在打包节点应用程序以进行传递时执行npm安装。也许从SVN中检查出来,npm安装并创建必要的tarball或rpm。

我在过去曾使用'bundler'作为红宝石,这很不错,因为您只需将所有代码放在另一个目录中,并且会拉入这些代码。如果您处于离线状态,则效果很好任何类似的节点?

+0

你在部署什么?我通常使用系统的软件包管理器对其进行打包(例如Debian的.deb,RedHat/Centos的.rpm等)。 – tjameson 2013-04-23 02:50:00

回答

3

在寻找类似的答案,我已经找到了这篇关于为什么有一些感觉,让您充分node_modules在源代码控制:

node_modules in git

虽然这是12月10日2011年,所以可能是现在有点过时了。

更新:在2014年1月,该建议存储所有node_modules在源代码控制仍然适用。

+1

因为像phantomjs这样的软件包,我会建议不要检查node_modules,例如为当前系统安装相应的二进制文件。这意味着如果一个开发人员在Linux上运行npm install并检查node_modules - 它将不会适用于在Windows上克隆回购的另一Dev。最好检查一下npm安装下载的tarball,并指向npm-shrinkwrap.json。您可以使用npm install -g shrinkpack工具自动执行此过程。 – 2016-07-15 08:17:00

1

我也遇到过类似的部署情况,我搜索这个方法的依据是使用make(unix工具)并编写我自己的Makefile。 Makefile是一个文本文件,它遵循特定的格式以及创建目标的位置,例如:test,publish,install .. 每个目标是从命令行调用时运行的一段Bash代码,例如: '发布'或者你可以将它们链接在一起,比如'make test publish'。因此,在我的场景中,我有一个执行测试的'测试'目标,然后我有一个'发布'目标,执行几个例如调用'npm install'然后'npm prune'(删除旧npm我停止使用依赖项)。然后,“发布”通过将文件夹的gzip压缩到一个单独的位置完成,然后将代码推送到我的生产服务器可以从其下载并解压缩的Intranet位置。所有node_modules代码都在zip文件中。 在生产服务器上,操作团队提取gzip,然后调用“make start”。 “开始”只是设置任何环境变量并启动节点应用程序的另一个目标。

总结,我有我的node_modules在源代码管理和我发现makefile是非常可定制的,因此它适合不同的项目有不同的需求,但你可以保持关于你的目标的命名约定,所以它很容易让其他团队工作人员和DevOps测试/发布/安装您的应用程序。

问候,路易斯。

2

有一个叫shrinkpack的CLI可以帮你管理这个。

它可以通过读取npm shrinkwrap图产生的依赖性和repointing的https://开头的URL每个依赖性(和子依赖性),而不是指向一个压缩包在你的项目中node_shrinkwrap目录。

node_shrinkwrap目录包含完全相同的.tgz的文件,从故宫注册表npm install下载和 - 因为一个npm-shrinkwrap.json文件存在(由npm shrinkwrap创建和更新shrinkpack) - npm install知道用tar包安装找到本地,而不是通过网络到npm注册表。

npm install -g shrinkpack