问题标签 [monorepo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
185 浏览

javascript - Lerna、常规提交和长期支持版本

我们在 monorepo 中有许多包,由 Lerna 管理并具有强制性的常规提交。虽然每个人都在主/最新版本的 HEAD 的同一页面上,但一切都很好。但是我们现在需要创建长期支持版本,即我们不断向后移植修复的主要版本。

这应该如何与 Lerna 一起工作?例如

  1. 假设我有a@1.0.0b@1.0.0并且b取决于a
  2. 由于版本冲突,我对a进行了重大更改并发布给我a@2.0.0b@1.0.1 。
  3. 我发现 a 中的一个错误,master 上修复它并发布它创建a@2.0.1b@1.0.2
  4. 我从上面的第 1 点创建一个分支并向后移植修复程序(出于长期支持的目的)。当我正确发布它时,它会尝试创建a@1.0.1但在尝试创建b@1.0.1时失败,因为该版本已经存在。

有任何想法吗?

0 投票
1 回答
1197 浏览

javascript - 带有 Expo 和多个入口点的 Monorepo

我有两个 Expo (React Native) 应用程序,它们共享大部分代码并且已经投入生产。我们正在尝试将它们移动到 monorepo 目录结构,如下所示:

我们的设置工作的方式是我们导出一个启动应用程序的函数,mobile-common/index.js并且mobile-{1,2}/index.js应该使用每个函数特定的初始化参数来调用这个函数。

此设置的问题在于mobile-common使用react-nativeexpo依赖项,这也是exp启动 React Native 打包程序所必需的,这在构建时会导致某些问题。我们尝试了以下方法:

  • mobile-common,expo和添加到和做react-native的依赖项中 。这允许我们运行打包程序,但移动应用程序在构建时会崩溃,因为它们会发现重复的依赖项。mobile-{1,2}/package.jsonlerna bootstrap
  • 我们也从来没有让纱线工作区工作。
  • lerna bootstrap --hoist也没有工作。
  • npm link在构建时还会产生具有重复依赖项的问题。

我们真的很想转向这种结构,因为我们以前的结构不容易让我们同时运行两个应用程序,而且它变得越来越有必要。

感谢您帮助我们!

0 投票
1 回答
2468 浏览

git - 如何在保持提交历史记录的同时将多个存储库迁移到单一存储库中?

我正在尝试将几个 Git 存储库迁移到一个 monorepo 中。

我有两个项目存储库,我们称它们project1project2. 在我的 monorepo 中,我想要一个projects包含两个子目录的目录,project1并且project2. 每个子目录都应包含来自相应项目的文件,并保留 Git 历史记录。

这甚至可以用标准的 Git 命令实现吗?

注意:我看过 Lerna -lerna import完全符合我的需要,但不幸的是它只适用于 JS 项目,而我的一个项目是 Ruby 项目。

0 投票
2 回答
355 浏览

git - 从现有的仅包含相关文件和提交的子目录创建新存储库

我有monorepo很多不同packages的地方。我想拿一个包并为它创建一个新的仓库。我想保留与项目文件夹中的文件有关的提交。

我尝试使用git filter-branchwith--subdirectory-filter可以使用指定文件夹中的文件创建一个分支。

但是,通过log命令和--all标志,您可以看到比在主分支中看到的更多提交。

这些提交中的每一个都有不属于所需的文件和数据subdirectory

如何删除这些文件?这是bfg进来的地方。

使用-p( --protect-blobs-from) 标志我可以传入master.

这将从整个存储库历史记录中删除不在分支中的所有文件。master

然而!如果您git log --all仍然看到所有额外的提交,提交中没有文件。

我正在寻找一种方法来为命令(例如./src/project)提供目录并拥有一个仅包含与该目录中的文件有关的文件和提交的存储库。

如何在不更改文件的情况下删除这些提交?

有一个bfg用于--prune-empty命令的 PR。这可能会有所帮助,但在合并之前不是一个可行的解决方案,而且我似乎仍然需要同时使用filter-branchbfg.

我也试过clone这个分支。理想情况下,有一种方法可以获取 master 并从中创建一个全新的存储库,其中只有那些refs.

更新:

我已经扩展了@BlythMeister 的帖子,文章中的filter-branch命令存在一个问题,它将把内容移到头部。所以我必须在之后运行它。subdirectory-filtersubdirectory

0 投票
1 回答
2113 浏览

typescript - TypeScript monorepos 中对等包的类型定义:开发与生产

我有一个使用yarn workspacesand的 monorepo 项目lerna;它的所有部分都是用 TypeScript 编写的。这些模块位于子文件夹中packages/module-n,每个模块都有自己package.json的以下几行:

每个包的源代码都位于packages/module-n/src/index.ts,所以没有什么不寻常的。

当涉及到从命令行构建或发布时,一切都很好——这要归功于每个包文件夹中tsconfig.jsonbuild脚本。然而,当涉及到 VSCode 中的日常代码编辑时,事情变得不是很方便,尽管我运行tsc --watch所有包以保持链接的依赖项同步。

当我命令单击引用对等包的定义时,VSCode 将我带到packages/package-n/dist/index.d.tspackages/package-n/src/index.ts当前可能正在编辑的位置。此外,当我想用​​ 重构某些东西时F2,文件可能偶尔会被修改,这会由于错误dist/index.d.ts而迫使我重新启动。build:watch问题是 TypeScript 看到手动调整**/dist/index.d.ts并拒绝进一步更新这些文件。

为了克服这种不便,我在 root 中编写了这两个脚本package.json,但我不喜欢我自己的解决方案:

这是我在同一个根目录中使用它们的方式package.json

这个想法是,在我开始在 VSCode 中编辑文件并因此使用 . 之前yarn build:watch,我packages/package-n/package.json通过替换"types": "dist/index.d.ts""types": "src/index.ts". 这修复了命令+单击和重构,这很棒。当涉及一次性构建时(例如在发布之前),"types"请恢复为"dist/index.d.ts".

我想知道是否有更好的方法来实现我所追求的目标,如果有人能给我建议,那就太好了。我很确定"src/index.ts"有一天我会意外提交,甚至发布具有此值的版本。的内容src/*.ts不包括在 npm 版本中,以保持我的包很小。

0 投票
4 回答
11334 浏览

node.js - 如何在具有纱线工作空间的 monorepo 中从 nodejs 项目构建 docker 映像

我们目前正在与我们的团队一起为我们的网站研究 CI/CD。我们最近还适应了 monorepo 结构,因为这使我们的依赖关系和概览变得更加容易。目前测试等已为 CI 做好准备,但我现在正在部署。我想创建所需包的 docker 映像。

我考虑的事情:

1) 将完整的 monorepo 拉入 docker 项目,但在我们的项目中运行 yarn install 会导致项目总大小约为 700MB,这主要是由于我们的 react native 应用程序甚至不应该有 docker 映像。此外,每次我们必须部署新版本时,这都会导致很长的图像拉取时间

2)以某种方式捆绑我的项目。使用我们的前端,我们有工作设置,所以应该没问题。但是我只是尝试将 webpack 添加到我们的 express api 并由于这个问题而在我的包中出现错误:https ://github.com/mapbox/node-pre-gyp/issues/308

3)我尝试只在需要的项目中运行 yarn install ,但这仍然会为我的所有项目安装我的 node_modules。

4) 运行 npm 包:pkg。这导致单个文件准备好在具有特定节点版本的特定系统上运行。这确实有效,但我不确定这将如何处理错误和崩溃。

5)另一种解决方案可能是将项目复制到工作区之外并在那里运行纱线安装。这样做的问题是纱线工作空间(隐式链接依赖项)的使用已经过去了。我必须明确添加我的其他工作区依赖项。一种可能性是从某个提交哈希中引用它们,我现在将对其进行测试。(编辑:您似乎不能将子目录作为纱线包引用)

6)???

我想知道我是否缺少一个选项,让某个项目只拥有所需的 node_modules,这样我就可以保持我的 docker 图像很小。

0 投票
1 回答
403 浏览

git - 在单一存储库中构建微服务的最佳策略是什么?

我有一个 mono repo (git),其中包含我正在处理的多个微服务。在推送时,第 3 方构建服务检测到此推送并开始处理构建和部署。

这很好用。但现在我正在尝试优化这个过程,我只希望它构建我一直在从事的特定服务。这意味着构建服务必须检测哪些文件夹已更改并仅构建这些服务。

我已经让这个过程在 Travis 上运行得很好,因为它有一个 GIT_COMMIT_RANGE 环境变量。所以我可以在我最新的推送中获取所有提交,然后在所有这些提交中获取已更改的文件夹..这真的很好..但在 travis 上。

我希望删除 travis 并直接在 GCP 或我正在使用的任何其他 3rd 方容器构建器上构建我的 docker 映像,但我只想构建已更改的文件夹。

我在想有可能用 git commit 钩子来做到这一点。通过这个钩子,我可以开始生成一个文件夹列表来标记构建服务器来构建,甚至开始生成一个构建文件(cloudbuild.yaml)。然后在一些 git push 钩子上,(甚至有一个 post-push 钩子)我在本地重置 cloudbuild.yaml 文件的内容。

0 投票
1 回答
7039 浏览

angular - 如何在具有不同库共享变量的 monorepo 中管理 SCSS 样式表?

我通过 Nrwl 设置了一个Angular monorepo,并且正在使用Angular Material 的主题,它使用 SASS。

我希望 SCSS 源文件在项目级别导入,我将覆盖默认颜色变量以进行主题化。

我遇到的问题是我想将 SCSS 源文件导入我的 monorepo 中的其他应用程序/库,以及这个 monorepo 之外的项目。

我可以像这样写我的导入:

...这将适用于 monorepo 内的任何内容。

或者我可以这样写:

...这在我的 monorepo AFAIK 中不起作用。

我如何让它在两种情况下都能正常工作?

它的设置类似于下图。

在此处输入图像描述

0 投票
1 回答
680 浏览

git - 为什么在将多个存储库合并到一个单一存储库后对文件运行“git log -m --follow”时会出现不相关的历史记录?

我有几个不同的 git 存储库,我想将它们合并到一个整体存储库中,同时保留它们的历史记录。我找到了一种方法来做到这一点,但我对 git log 向我显示的单个文件历史记录有点困惑。

这是我的输出:

git log --oneline

组合回购的输出

git log --oneline repoA/README.md

组合回购的输出

git log --oneline -m --follow repoA/README.md

组合回购的输出

从所有单独的存储库作为捆绑包开始,我执行以下操作来创建我的整体存储库:

对于回购 A/B/C

创建组合仓库 git init echo "initial" > README.md git add 。git commit -m '初始提交'

对于每个回购

为什么我在使用“-m --follow”运行时会得到与特定文件无关的 git 提交历史记录?我希望只看到与文件有关的提交。

更新(尝试使用不同名称和内容的文件的日志):

0 投票
0 回答
2004 浏览

npm - 如何为现有的 Lerna mono-repo 生成每个包的 package-lock.json

我们有一个现有的Lerna mono-repo,其结构如下:

我们目前在项目中使用 Yarn,实际上只有一个顶级yarn.lock文件,没有每个包yarn.lock,因为我们从未使用过 Workspaces。

我们正在尝试切换到 npm,并希望package-lock.json为 mono-repo 中的每个包生成一个文件,而不仅仅是顶层。我们应该怎么做?运行npm run lerna bootstrap --hoist会创建一个顶级锁定文件,但不包含任何"dev": true标签,也不包含任何本地包。我能做的最好的事情是做npm run lerna add somePackage --scope=package1,即使somePackage已经存在于 中package,也会导致为 mono repo 中的每个包生成一个package-lock.json文件,除了package1. 此外,生成的package-lock.json文件没有任何开发依赖项。

此外,我无法进入每个包并运行npm install,因为npm不了解我们在 mono-repo 中其他本地包所依赖的许多本地包。奇怪的是,即使在package-lock.jsonnpm 通过 生成的文件中lerna add,这些文件也不包含对本地包的任何引用,只包含对外部包的引用。

那么:如何为package-lock.jsonmono-repo 中还包含 devDependencies 的每个包生成一个文件?