Npm - 如何管理one-repo,多包代码库

问题描述 投票:0回答:1

我正在构建一个需要可扩展和可维护的node.js应用程序。我们的想法是拥有一个存储库,但其中包含多个模块。

我们正在使用带有npm的local modules,但我们遇到的一个问题是,当我们更新模块时,npm不会更新依赖服务。

这里是package.json的一个例子

// ./app/package.json
{
   "dependencies": {
     "error-lib": "file:../modules/error-lib"
   },
   "scripts": {
     "start": "node app.js",
     "debug": "node --inspect-brk app.js",
   },
   "main": "app.js",
}

// ../modules/error-lib/pacjake.json
{
  "name": "error-lib",
  "version": "1.0.0",
  "main": "index.ts"
}

当开发人员更新error-lib模块时,我遇到一个问题,npm install命令不会更新error-lib中的旧app/node_modules

我不想在每次更改时都碰到模块的版本,因为它们遵循相同的版本控制和发布生命周期。而且我不想每次都手动rm -rf modules

有关如何使用许多本地模块自动化仓库的任何想法?


TL; DR(为什么一个回购,很多本地模块)

我们来自Java背景,我们有一个由maven管理的repo多模块架构。我们在maven中所做的是在隔离模块中隔离服务,通用库和数据模型。

我们只有一个repo用于所有模块和服务,因为每个人都遵循相同的发布周期和统一版本。

当开发人员需要应用某些更改时,他或她可以更新其中一个模块或服务,并且maven将负责每个依赖项,并且代码将是最新的并准备好了。

但我们想要单独的模块有很多原因:

  1. 这将迫使我们解耦功能并使代码可重复使用,因为每个模块可以随时放置在单独的仓库中。
  2. 如果某些模块在repo之外可用,则可以进行外部化和维护。

我们想为node.js中的新部件实现相同的设计

javascript node.js npm node-modules codebase
1个回答
0
投票

看起来你需要$ npm link,在./app/node_modules中为你的包创建符号链接。这样,链接的包始终是“最新的”。

链接包是一个两步过程:

  1. $ npm link../modules/error-lib在你的全球node_modules文件夹中创建了一个符号包,名称为error-lib,在../modules/error-lib/package.json中指定为"name"值。
  2. $ npm link error-lib./app创造./app/node_modules内部的第二个链接到<global-node_modules>/error-lib

more about npm link


编辑以回应您的评论:

我看到了npm链接的一些缺点:

  1. 应用程序package.json中没有列出依赖项,所以我怎么知道我要链接哪个依赖项呢?
  2. node_modules没有在repo上提交,因此CI / CD需要在app package.json中列出modules / error-lib时进行链接。我有一个地方可以跟踪依赖项。

有关如何自动化npm链接或减轻缺点的最佳实践?

NPM包应该通过npm注册表分发。这意味着您的error-lib包也应该以这种方式分发,并作为任何其他包安装。这将要求您提前在package.json文件中列出您的包,这基本上就是您想要的。

如果您打算将所有内容保存在一个地方,则根本不使用NPM。只需在软件中使用相对导入路径解析包。

既然你说所有软件包都遵循与主软件相同的发布周期,并且它们存在于同一个repo中,为什么你会用NPM解析这些软件包,而它们看起来更像是软件的一部分?

error-lib是一个包,或者不是。如果是,它理想地拥有自己的CI / CD管道,根据需要大或小,涉及测试,构建和分发。然后,此管道将在依赖存储库的管道之前运行。

© www.soinside.com 2019 - 2024. All rights reserved.