我有一个带有几个项目的小型monorepo(它们共享相同的数据存储,因此将它们一起放在monorepo中进行开发和测试会更容易)。每个项目都在其自己的文件夹中,并带有自己的package.json。每个项目都应独立部署(独立于其他项目)。
我想在项目之间共享一些代码。我想保持它们的相对独立性,所以我宁愿不必在根repo文件夹中创建“构建”步骤,也不必拥有每个项目自己的构建步骤。理想情况下,每个项目的部署将继续在项目的文件夹中完成,而无需了解其他项目。
我知道我可以在回购中创建一个npm模块,并从每个项目中npm link
来创建它。这是我所追求的解决方案。但我想知道是否有人有更好的主意。
以下是目录结构的示例:
/package.json
/docker-compose.yml
/project-1/package.json
/project-2/package.json
如果使用npm link
解决方案,我会添加一个project-shared
文件夹,并从project-1
和project-2
链接到它。
答案 0 :(得分:1)
这是我目前正在使用的npm链接解决方案。看来,这是一个不错的解决方案,所以我想将其发布为答案。我尚未为该项目实施部署工作,因此我不知道部署将在此方面进行得如何。我希望它将与其他所有组件一起部署链接的模块。
项目目录结构如下:
/package.json
/docker-compose.yml
/project-1/package.json
/project-2/package.json
/project-shared/package.json
在每个项目的package.json(project-1
和project-2
)中,我添加了以下安装后脚本:
"scripts": {
"postinstall": "npm link ../project-shared"
},
因此,链接将在项目的常规设置期间创建。
注意:由于某种原因,使用preinstall
脚本将无法正常工作(虽然链接看起来像是在运行,但不会创建链接)。 postinstall
可以正常工作。
我不太确定共享模块的依赖项安装如何工作(例如,如果项目链接到共享模块时,是否将安装共享模块的依赖项,或者我是否必须独立安装它们)。
我遇到的一个问题是Docker Compose在链接的软件包中不能很好地工作(symlinked文件夹不会指向容器内的正确位置)。我通过将共享文件夹安装在node_modules文件夹中的符号链接上来解决此问题。例如,对于project-1
:
volumes:
- "./project-1/:/home/node/app:ro"
- "./project-shared/:/home/node/app/node_modules/project-shared:ro"