问题标签 [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 投票
2 回答
1970 浏览

node.js - 使用对等依赖和本地(文件:../some-lib)依赖

我有一个 monorepo,里面有很多微服务。我想让任何需要它的微服务都可以使用一些库类型的函数/类。但是,如果该库包声明了对等依赖项,则在从依赖于该库的事物中运行代码时将找不到对等依赖项。

考虑这个回购结构:

    • 一些库(peerDepends on foo
      • index.js(需要foo
      • node_modules 将为空
  • 服务
    • 一些服务(取决于foo, 和some-library
      • index.js(需要some-library
      • node_modules 将具有:
      • foo
      • some-library将是一个符号链接../../lib/some-library

运行时node services/some-service/index.js,您将收到错误“找不到模块 'foo'”,来自lib/some-library/index.js.

可能发生这种情况是因为节点只查看祖先目录中的lib/some-library/node_modules任何文件夹。node_modules但是由于此代码是从services/some-service(作为工作目录)运行的,并且由于 中的符号链接services/some-service/node_modules,我希望这可以工作。

这是一个您可以轻松克隆以查看问题的存储库:https ://github.com/jthomerson/example-local-dependency-problem

我只看到两个解决方案:

  • 不要在库中使用 peerDependencies
  • 为了本地开发和测试,在项目的根目录安装每个对等依赖项。

这些都不是一个真正好的解决方案,因为它不允许每个服务具有不同版本的依赖项,因此意味着如果依赖项的本地版本(或库的版本)被碰撞,所有使用该库的服务然后让它们的依赖版本同时碰撞,这使它们更加脆弱,因为它们都捆绑在一起。

0 投票
0 回答
19 浏览

git - 依赖于 package.json 中分支的工作区包?

假设在我的 package.json 中,我next通过在我的依赖项中声明来依赖一个分支:

该存储库具有工作区(可以说是本地包)。例如:ra-ui-materialui

在同一个分支中dependencies,我要添加什么package.json依赖?ra-ui-materialuinext

0 投票
1 回答
1583 浏览

amazon-web-services - 在具有共享代码的多个服务的 monorepo 上使用无服务器框架

我在 AWS 上有一个 pythonic 无服务器项目,其中几个服务包含在一个存储库(monorepo)中,如下所示:

'general' 是一个在不同服务之间共享的包,因此我们必须在根目录中使用单个 'serverless.yml' 文件(否则不会部署)。

我们有两个困难:

  1. 单个“serverless.yml”可能过于混乱且难以维护,它会阻止我们使用全局配置(这可能非常有用)。

  2. 部署单个服务很复杂。我想“包”功能可能会有所帮助,但我不太确定如何正确使用它。

对于这种情况,有什么建议或最佳实践吗?

0 投票
2 回答
1520 浏览

docker - GitLab CI 构建多个 docker + 端到端测试

我想从 GitLab 中的一个 repo 构建和测试多个 docker。这个 monorepo 包含一些协同工作的微服务。
我们有一项工作docker compose up可以帮助本地开发人员,所以这就是一个开始。目标是将构建 + 测试移至 GitLab,运行这些 docker 的 E2E 测试(端到端),并让 GitLab 升级我们的暂存环境。

多个 docker 的构建只是(一个)管道的构建阶段中的多个作业,我猜每个 docker 都可以进行测试,这使得在(或?)暂存环境中运行多个 docker 来测试整个。

  1. GitLab 如何在多个 docker 上运行 E2E 测试?(或者这是不明智的开始)

  2. 我们是否需要 Kubernetes 来实现 docker-compose 现在促进的 docker 间映射(网络、卷以及依赖项)?

我们正在使用一个自托管的 GitLab CE 实例。

更新:缩短,使用适当的术语。

0 投票
0 回答
199 浏览

apollo-server - Lerna 找不到符号链接模块的对等依赖项

嗯,不确定这是 lerna 中的错误还是我做错了。我有一个案例,我有一个 lerna monorepo 包,它有一个 peerDependency,它应该在“消费”monorepo 包中找到:

  • @red/app有一个dependencyto@red/gql和 tographql
  • @red/gqlpeerDependency一个graphql

@red/gql使用graphql(实际上它是使用它的依赖项之一,并且还需要它作为对等依赖项),当我从中调用它时@red/app找不到graphql.

如果我bootstrap使用该hoist选项,它确实可以工作,所以在我看来它无法找到graphql包,@red/gql因为它是符号链接的并且它graphql在错误的文件夹中搜索。

0 投票
1 回答
1914 浏览

reactjs - 如何在使用 Next.js 完成的外部项目中使用 Storybook 组件(和 Lerna)?

我刚刚创建了我的 Storybook 组件库(ES6 等)。它的结构是一个 Lerna 项目(所有组件都隔离在 packages/ 文件夹中)。但是,这是一个没有真正发布功能的私人仓库,所以我认为 Lerna 不能使用私人(免费)帐户。我已经将 Storybook 存储库按原样推送到了我的 Bitbucket。

现在,我想使用主应用程序中的组件故事书库,这是基于 Next.js 构建的不同存储库(在 Bitbucket 上)。

我试图按如下方式导入各个故事书组件

但它显然不起作用,返回此错误:

这是因为MyComponent是一个 jsx 文件。我希望 Next.js 能够转换导入的模块,但事实并非如此。

我的问题是:

  1. 我的胆量说将整个故事书作为git+ssh://git@bitbucket.org/myusername/storybook-repo.gitfrom导入package.json不是一个好主意。有更好的解决方案吗?

  2. Lerna 是否仅适用于我可以发布我的包的公共/专业存储库?

  3. 为什么 Next.js 不转译导入的 jsx 模块?在这一点上,这个过程是如何工作的?我应该从远程仓库转换故事书组件还是从我的主应用程序中完成这项工作?

谢谢

0 投票
2 回答
1570 浏览

git - 如何分叉部分monorepo并且仍然能够合并上游提交?

有时我会在 GitHub 上找到由多个 npm 包组成的monorepo,我想对其进行一些修改并在我的项目中使用它。但是对于 npm 来说,从 git 子目录安装包比从 git 存储库[ 1 ][ 2 ]安装要困难得多。由于我会自己进行修改,我想知道如何设置自己的 git 存储库,以便 npm 易于安装,并合并上游更改。

目前,我使用GitHub 上的这个指南将包与 monorepo 的其余部分分开,即

Npm 可以轻松安装 repo,但我发现很难合并任何上游更改。

有没有人这样做过?任何想法?

0 投票
0 回答
211 浏览

webpack - 带有 webpack 的 monorepo(如何在构建中包含资产)

我正在尝试创建包含使用 typescript 和 sass 构建的组件的 monorepo。文件夹结构如下所示:

我想在 app1 和 app2 中使用组件。我尝试的是构建组件DllPlugin并在 app1 和 app2 中引用它DllReferencePlugin,它适用于打字稿文件,但是 scss、图像、字体和其他资产呢?在构建 app1 或 app2 时,我希望他们的 dist 文件夹包含来自组件的所有资产。我不直接导入components/src/Modal没有 dll 插件的原因是 components 文件夹可能有不同的 webpack 配置,例如别名。实现这一目标的最佳做法是什么?

0 投票
0 回答
2185 浏览

symlink - 使用 Yarn 工作区,编译后的二进制文件如何链接到编译后的工作区?

语境

Yarn 工作区提供了一个方便的类似 mono-repo 的功能,其中包被自动链接。即它们可以相互要求/导入,并且它们的二进制文件可以从工作区根目录链接和访问。

一个例子:

工作区/package.json

工作区/包/a/package.json

工作区/包/a/src/index.js

如果您然后将目录更改为主工作区并运行yarn install,yarn 会正确链接二进制文件,您可以运行:

从工作区目录就好了。伟大的!

问题

我遇到的问题是,如果您的代码首先必须被编译,则二进制文件在完成之前将不可用yarn install(因为您不应该在版本控制中发布编译后的代码)。我使用 Typescript 来编译我的 cli:

重命名并更新index.js为:index.tsa/package.json

即使在工作区目录上dist/index.js运行时正确构建yarn install,它也无法创建到二进制文件的链接:

问题

当我的二进制文件需要在安装时编译时,如何使纱线工作区二进制链接工作?

如果我需要使用 Lerna 来完成这项工作,那也完全可以(尽管最好避免调用,lerna bootstrap因为这对于纱线工作区来说应该是多余的)。

0 投票
1 回答
1686 浏览

javascript - 如果 monorepo 应该只包含一种语言项目?

我想知道... monorepo 是否应该包含用相同语言编写的项目?我考虑将我的前端和 PHP 项目推送到 monorepo 以在它们之间共享 JSON 配置。

这样做是否值得,或者用特定语言编写的项目应该放在不同的 monorepo 中?