我正在构建一个需要可扩展和可维护的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将负责每个依赖项,并且代码将是最新的并准备好了。
但我们想要单独的模块有很多原因:
我们想为node.js中的新部件实现相同的设计
看起来你需要$ npm link
,在./app/node_modules
中为你的包创建符号链接。这样,链接的包始终是“最新的”。
链接包是一个两步过程:
$ npm link
的../modules/error-lib
在你的全球node_modules
文件夹中创建了一个符号包,名称为error-lib
,在../modules/error-lib/package.json
中指定为"name"
值。$ npm link error-lib
的./app
创造./app/node_modules
内部的第二个链接到<global-node_modules>/error-lib
。编辑以回应您的评论:
我看到了npm链接的一些缺点:
- 应用程序package.json中没有列出依赖项,所以我怎么知道我要链接哪个依赖项呢?
- 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管道,根据需要大或小,涉及测试,构建和分发。然后,此管道将在依赖存储库的管道之前运行。