2012-02-07 52 views
5

我即将用node.js做一个大型项目,目前尝试对几件事情进行排序。使用node.js npm和git的最佳工作流程

在早期的节点项目中,我使用了所有节点模块的额外文件夹。此文件夹是由git的忽略,我通过git的子模块,这是不容易的托管版本和更新

我所寻找的是(没有依赖关系,更新到新版本并不总是有趣的。):

npm install packagename
npm dump_modules_into_file

所以其他人谁是参与这个项目可以做:

npm install_or_update_modules_from_file

我不想让我的git存储库跟踪node_modules。基本上我想要类似于symonfy2如何处理它的东西bundles

P.S .:我知道npm submodule packagename,但这个命令不是很有帮助,因为它不安装依赖关系,它不更新模块。 P.2:我准备好了package.json,但这也有一些缺陷。 (没有参数,你必须手动更新模块版本。)

+1

你是什么意思“'package.json'没有参数?” – 2012-02-08 02:31:04

+0

例如:要使用native C++解析器安装mongodb,您需要执行:'npm install mongodb --mongodb:native'。在使用'package.json'时,我还没有想出如何将这个本地部分传递给npm。 – TheHippo 2012-02-08 11:39:47

回答

6

package.json将完成您正在寻找的东西。在关于传递--mongodb:native标志的注释中,该标志是npm命令的参数,确实是在您自己的项目中使用package.json时可以工作。 mongodb软件包有一个“安装脚本”,用于在节点处理环境中查找该标志。如果该标志存在,那么它会产生另一个构建过程。所以,如果你已经在你的package.json

{ 
    "name": "MyProject" 
    , "description": "Test" 
    , "version": "0.0.1" 
    , "dependencies": { 
     "mongodb": "*" 
    } 
} 

运行npm install --mongodb:native工作的MongoDB作为一个依赖。

关于“手工更新” - 这只是第一次,它可能需要一段时间,我相信你可以写一个脚本来生成它,如果有很多的依赖关系。然而,这听起来像你有一个相当大的团队,如果是这样的话,那么自动化更新到package.json将变得非常丑陋(认为新的开发人员,实验功能等)。)在这部分开发周期中对破坏版本负责不一定是一个坏主意。

参考文献:

编辑:和尼克提到,加入 'node_modules' 目录.gitignore将阻止任何这些文件被检入您的回购

+0

感谢参数传递给npm的参数!我将在一个bash脚本或一个Makefile中包含npm命令,我们很乐意去... – TheHippo 2012-02-20 17:55:09

+0

http://npmjs.org/doc/shrinkwrap.html本来可以帮到的。 – TheHippo 2012-02-27 06:02:39

2

Afaik,唯一的包管理方法是你描述的,尽管我不确定你对wrt package.json不感兴趣。

如果您想严格控制您使用的模块版本,您可以明确指定版本号。您也可以使用>=X.X.X方法自动获取最新的(超过阈值),这对于开发目的而言有时是很好的。

这让你的队友做的事:

npm install . 

这将安装的package.json文件中列出的所有依赖关系。这些将安装到./node_modules,但您可以.gitignore,如您所述。

6

她e是一篇很好的文章,可以解释何时应该检查node_modules到git中。可以回答你的问题。

node_modules in git

+1

更喜欢http:// npmjs .org/doc/shrinkwrap.html – 2012-03-14 16:47:40

+0

这是值得读的既给文章和链接关于node-shrinkwrap – 2013-01-24 17:18:40

0

为了全面测试封装配置,并确保模块的表现为他们将最终部署我现在使用下面的过程。它完全避免了需要破解你的node_module目录或require()代码,所以当你去部署它时只是作品

对于内部项目或预发布到GitHub上您可能还需要设置"private": truepackage.json所以npm将拒绝予以发表。

  1. 创建Git版本控制下的项目目录,并添加所有节点模块的子目录。子目录名称必须与其软件包名称匹配。如果您正在使用github,那么您将需要为每个模块目录创建一个单独的git repo。他们可以在你的项目回购中使用git submodules。将node_module添加到您的.gitignore文件中。

  2. 安装像npm-server这样的工具并在项目目录中运行它。然后将npm注册表设置为localhost,所以现在npm将与您本地的npm服务器通信以获取软件包。它会发现它将发送的子目录。任何它没有发现它将代理registry.npmjs.org $ npm set registry http://localhost:6070/ $ cd ~/projects $ npm-server

  3. 启动一个新的外壳,创建一个单独的sandbox目录 $ mkdir sandbox $ cd sandbox

  4. 使用本地注册服务器将应用程序安装。清除本地npm缓存并重新安装您的应用程序。我在一行上做这个,所以很容易通过shell重做。你可能想编写它。

    $ npm cache clear; sleep 3; npm uninstall -g app; sleep 3; npm install -g app

  5. 测试您的应用程序:

    $ app ....

  6. 注销当您完成安装本地NPM注册表:

    $ npm set registry http://registry.npmjs.org:80/

  7. 一旦你完成测试你可以发布是你的应用程序,并停止npm-server重新测试部署。

$ cd ~/projects $ npm publish app


而不是注册&注销的服务器,你可以只使用本地主机服务器进行一次性的安装: $ npm --registry=http://localhost:6070/ install app


我在编写npm-server分叉版本的过程,所以你只需要: $ npmsvr on // Registers local registry server $ npmsvr start // Start local registry server $ npmsvr off // Deregisters local registry server

+0

我刚刚发布npmmsvr到npm注册表,使这个任务更容易。 https://www.npmjs.org/package/npmsvr – 2014-07-30 05:27:44

+0

请注意,这个版本只是'npm'和'npm-server'的一个小前端,所以你仍然需要安装'npm-server' – 2014-07-30 05:33:27