使用node.js、npm和git的最佳工作流程

7

我将要使用Node.js做一个大项目,目前正在尝试整理一些事情。

在以前的Node项目中,我有一个额外的文件夹存放我所用到的所有Node模块。这个文件夹被Git忽略,我通过Git子模块来管理版本和更新,但不是很容易(没有依赖性,更新到新版本也不总是愉快的体验)。

我想要的是:

npm install packagename
npm dump_modules_into_file

这样,其他参与这个项目的人就能:

npm install_or_update_modules_from_file

我不想在Git仓库中追踪node_modules。基本上我想要类似于Symfony2如何处理 bundles

P.S.: 我知道 npm submodule packagename, 但这个命令并不是很有帮助,因为它不会安装依赖项,也不会更新模块。

P.S.2: 我了解package.json,但它也有一些缺陷。 (没有参数,你必须手动更新模块版本。)


1
package.json没有参数”是什么意思? - Jesse Fulton
要使用本机C++解析器安装mongodb,您需要执行以下操作:npm install mongodb --mongodb:native。当使用package.json时,我还没有弄清楚如何将这个本机部分传递给npm。 - TheHippo
3个回答

6

package.json可以实现您想要的功能。在您提到传递--mongodb:native标志的评论中,该标志是npm命令的一个参数,并且在使用自己项目中的package.json时确实有效。mongodb包有一个“安装脚本”,它在节点处理环境中查找该标志。如果存在该标志,则会为构建生成另一个进程。因此,如果您的package.json中有mongodb作为依赖项,则可以使用该标志。

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

运行npm install --mongodb:native命令将起作用。
关于“手动更新”,实际上只有第一次可能需要花费一些时间,如果有很多依赖项,我相信你可以编写一个脚本来生成它。然而,听起来你有一个相当大的团队,如果是这样的话,自动化更新package.json将会变得非常复杂(考虑新开发人员、实验性功能等)。在开发周期的这个阶段对破坏构建负责并不一定是个坏主意。
参考资料: 编辑: 正如Nick所提到的,将“node_modules”目录添加到.gitignore将防止任何这些文件被检入您的代码库。

谢谢你提供的有关npm参数的提示!我将在bash脚本或Makefile中包含npm命令,然后我们就可以开始了... - TheHippo

2

据我所知,进行软件包管理的唯一方法是您所描述的方式,尽管我不确定您对 package.json 不感兴趣的具体内容。

如果您想要严格控制所使用模块的版本,您可以明确指定版本号。您也可以使用 >=X.X.X 的方式自动获取最新版本(高于某个阈值),这在开发过程中有时是可行的。

这样可以让您的团队成员执行以下操作:

npm install .

这将安装包.json文件中列出的所有依赖项。它们将安装到./node_modules,但您可以像您指出的那样在.gitignore中忽略它们。


1
为了充分测试软件包配置并确保模块在最终部署时的行为,我现在使用以下过程。它完全避免了需要修改 node_module 目录或 require() 代码的需求,因此当您进行部署时,它会“一切正常”。 对于内部项目或预发布到 github,您还可能希望在 package.json 中设置 "private": true,以便 npm 拒绝发布它。
  1. 在git版本控制下创建一个项目目录,并将所有的node模块作为子目录添加进去。子目录名必须与它们的包名匹配。如果你使用github,你会想为每个模块目录创建一个单独的git仓库。它们可以成为你项目仓库中的git子模块。将node_module添加到你的.gitignore文件中。

  2. 安装一个类似npm-server的工具并在项目目录中运行它。然后将npm注册表设置为localhost,这样npm将与你本地的npm服务器通信以获取软件包。任何它作为子目录找到的东西都会发送。任何它没有找到的东西都将代理到registry.npmjs.org

    $ npm set registry http://localhost:6070/ $ cd ~/projects $ npm-server
  3. 启动一个新的shell并创建一个单独的沙盒目录。 $ 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

在命令行中,进入“~/projects”目录并发布名为“app”的npm包。
与其注册和注销服务器,您可以只使用本地主机服务器进行一次性安装: $ npm --registry=http://localhost:6070/ install app
我正在编写一个分支版本的 npm-server,所以你只需要执行以下命令: $ npmsvr on // 注册本地注册表服务器 $ npmsvr start // 启动本地注册表服务器 $ npmsvr off // 注销本地注册表服务器

我刚刚将npmsvr发布到npm注册表,以使这个任务更加容易。https://www.npmjs.org/package/npmsvr - Tony O'Hagan
请注意,此版本只是npmnpm-server的小型前端,因此您仍需要安装npm-server - Tony O'Hagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接