如何组织一个项目来共享代码?

How can I organize a project to share code?

我正在我构建的通用核心之上编写一些应用程序,这是一种我自己的框架。

我想链接此应用程序,因此如果我更新公共核心中的文件,每个应用程序也会更新。

所以我这样组织代码。我创建了一个 github 项目,在主分支中有公共核心文件,然后每个分支都是不同的应用程序。因此,如果我更新公共核心,我可以创建从主分支到应用程序分支的拉取请求,公共核心将被更新。

像这样一切正常,唯一的问题是当我遇到特殊情况时。

如果我必须在应用程序分支中编辑一个公共核心文件,因为例如我需要针对该应用程序的不同行为,我希望有机会隔离和编辑公共核心的单个文件就在应用程序分支内,但其他文件应该像以前一样更新。

相反,显然在这种情况下我无法再合并拉取请求,因为应用程序分支中的文件与公共核心中的文件不同。

我的项目通常是这样组织的:

core/...
features/...
public/...
main.ts

corepublic 文件夹包含通用核心文件,通常这些文件不会更改。所以我对通用核心存储库进行分支,在文件夹中添加功能模块,然后从 main.ts(它是一个打字稿网络应用程序)加载所有模块(核心和功能)。在 public 文件夹中,我有应该不会改变太多的支持文件。使用此架构,一切正常,直到我需要为一个应用程序更改 public 文件夹中的文件。如果我更改它,我将无法再合并分支并从公共核心文件接收更新。

我之前尝试过子模块的方法,但我一点都不满意。

目标是能够从公共核心文件中获得持续更新,即使其中一些在本地发生了变化并且应该是“未跟踪”或类似的东西。

您对如何解决这个问题或以更好的方式组织代码有什么想法吗?

非常感谢

git 的最新版本具有 sparse-checkout 功能。

您可以查看here了解更多详情。

我认为您的场景非常适合 monorepo。执行此操作的方法是使用工作区。为此,我一直在使用 yarn workspaces (yarn1, yarn2), recently npm also introduced workspaces, but I haven't tested them recently. This is also possible using lerna.

基本思路是在同一个repo中可以有多个npm项目,可以直接link。它类似于安装依赖项,唯一的区别是此依赖项是本地的。所以你可以有这样的结构:

  • apps/app1
  • apps/app2
  • libs/core
  • libs/features

然后在应用程序的 package.json 文件中,您可以直接添加对要包含的 core/feature(或任何其他)库的引用。