当前位置: 首页 > 知识库问答 >
问题:

javascript - monorepo 项目是否可以做到不被固有的目录结构所限制?

张逸清
2024-08-19

在使用pnpm workspace.yaml 来实现monorepo的时候,需要:预先配置好项目结构

image.png

1)多个项目都放在packages/目录下
2)想要共享的子包,放在定义的 components/目录下(或加上其他的目录)

image.png

===

但是这样的目录结构是有限制的。

比如我们开发多个项目(eg. react-demo-08, react-demo-09):
1)项目的目录结构已经成型:
image.png
2)并且开发的时候,都是VSCode打开react-demo-08, react-demo-09 这样多个界面

请问现在想要对react-demo-09内的components下的一个子包进行共用,使用现有的 pnpm + monorepo 技术是做不到的是吗?

共有3个答案

高德水
2024-08-19

首先是开发的时候,应该打开pnpm-workspace.yaml 所在的目录。而不是每个项目单独打开。

在components下新建一个app,例如shard_01, 那么把react-demo-09中共用的部分,剪切到components/shard_01/index.ts 作为独立的包,并配置components/shard_01/package.json

"name": "@components/shard_01"

然后在react-demo-08, react-demo-09的package.json中引用这个包。

"dependencies":{
    "@components/shard_01": "workspace:*",
}

然后在项目内写入引用语句

import * as shard_01 from '@components/shard_01';
console.log(shard_01)
姜经武
2024-08-19
  1. monorepo 就应该按照 monorepo 来用。你不能说我习惯骑自行车,汽车为啥不给我装脚蹬子?你应该用 IDE 打开 monorepo 根路径,然后使用 workspace 方式引用组件。
  2. 看目录名反正你也是 demo 而已,那就把公共代码复制一份放到 /components 不就好了。
  3. 你也可以直接在 08 项目里安装引用 09 项目。
  4. 如果也不想这样,使用软链的方式也可以,单独建立一个组件目录,指向统一的文件。
郭彬郁
2024-08-19

在monorepo项目中,确实通常会有一个预先定义的目录结构来组织不同的包(packages)和可能的共享组件(components)。然而,这并不意味着monorepo项目必须被这种固有的目录结构所限制。相反,你可以通过一些配置和调整来灵活处理你的项目结构,以满足你的特定需求。

对于你提到的情况,即使你的项目(如react-demo-08react-demo-09)已经存在于一个更广泛的项目结构中,你仍然可以:

  1. 使用软链接(Symbolic Links)或别名(Aliases):如果react-demo-09需要访问react-demo-08中的某个组件或库,并且你不想或不能改变它们的物理位置,你可以使用操作系统的软链接功能来在react-demo-09的目录中创建一个指向所需组件的链接。不过,这种方法可能需要你在构建和运行时处理路径解析的问题。
  2. 调整pnpm配置:在pnpmworkspace.yaml中,你可以灵活定义哪些目录或文件被视为工作区的一部分。虽然pnpm默认会寻找packages/目录下的包,但你可以通过修改配置文件来包括其他路径。例如,你可以将react-demo-08react-demo-09的components目录都添加到工作区配置中,这样它们就可以被pnpm识别为可共享或依赖的组件库。
  3. 重构项目结构:如果可能的话,考虑重构你的项目结构以更好地适应monorepo模式。这可能包括将共享组件移动到一个专门的components目录或packages目录下的一个新包中,然后在需要的地方通过pnpm的依赖管理功能来引用它们。
  4. 使用路径别名:在TypeScript、Webpack等配置中,你可以设置路径别名来简化对项目中不同部分的引用。这有助于你即使在不改变物理结构的情况下,也能以更灵活的方式组织代码。

综上所述,虽然monorepo项目通常会遵循一定的目录结构约定,但你完全可以通过上述方法或其他创造性的解决方案来绕过这些限制,以适应你的特定需求和工作流程。

 类似资料:
  • 项目模块的命名以及目录结构 一、项目的命名规则 PS : 项目的基础包路径和项目的命名一致 1 . 服务接口 : 项目名称 + 逻辑层名称 + 模块名称 + interfaces 服务接口例子 : banniu.data.salecrm.interfaces 基础包路径就是 : banniu.data.salecrm.interfaces 服务接口后面的interfaces是固定的 2 . 提供

  • 我查看了我的pycharm项目,注意到有2个不在那里,查看了我所有的IDE版本,没有。现在我100%确定我做了这些项目,所以我的问题是pycharm对它能容纳的项目有限制吗?我注意到,当我试图用我已经拥有的大量项目创建一个新项目时,pycharm加载新项目窗口的速度似乎很慢,或者有时根本无法加载,我必须多次创建项目才能注册。 希望你们能回答这个问题

  • 场景如下:有三个项目A,B,C,这三个项目的关系如下图 A是一个核心项目,其最终会使用Electron打成一个独立的项目A.EXE B项目是A项目的超集,在A的基础上会增加一部分功能,最终是一个B.WEB项目 C项目是B项目的超级,在B的基础上也会增加一部分功能,最终也会使用Electron打成一个独立的项目C.EXE 经过一番调研,前端打算使用pnpm构建Monorepo架构,初步设想如下: c

  • 问题内容: 我从事过maven项目,其中目录结构如下: 我想知道是否存在其他目录结构约定。此约定是Maven特定的还是适用于所有Java?我有一个需要多种编程语言的项目,并对是否存在某种标准感到好奇。 问题答案: 它是Maven特定的目录结构约定,但是它在Maven领域之外也很流行,因为它很好(就像其他有意义的约定一样),没有理由不将其与Ant管理的项目一起使用常规Java项目。甚至项目的Java

  • 嗨,我已经使用以下命令在Ubuntu16.0.4中安装了JDK10。 我遵循下面的链接安装Java10。 如何在Ubuntu下安装JDK10? 他们正在显示正确的版本。 我尝试了安装的两个选项,但当我给出JDK路径表单IntelliJ时,我得到的是 “所选目录不是JDK的有效主目录”错误。

  • 当默认的项目结构不适用时,可以自定义配置。查看 Gradle 文档中 Java plugin 部分以了解如何在纯 Java 项目中进行配置。 Android plugin 使用了类似的语法,但因为 Android 有自己的 sourceSets,所以需要配置到 android 块中。下面的例子使用了旧的项目结构(Eclipse),并把 androidTest 的 sourceSet 映射到 tes