monorepo 中的“'rootDir' 应包含所有源文件”

Posted

技术标签:

【中文标题】monorepo 中的“\'rootDir\' 应包含所有源文件”【英文标题】:"'rootDir' is expected to contain all source files" in monorepomonorepo 中的“'rootDir' 应包含所有源文件” 【发布时间】:2020-07-10 18:00:37 【问题描述】:

我正在为客户将一个大型(ish)monorepo 转换为 TypeScript,但是,我自己对 TS 还很陌生,遇到了一个我找不到明显解决方法的错误。

TS6059: File '[path to repo root]/packages/config/globals.ts' is not under 'rootDir' '[path to repo root]/packages/components/src'. 'rootDir' is expected to contain all source files.

globals.ts 文件不应该存在于components 包中,它属于config 包,所以我不太明白这个错误。

我在 repo (https://github.com/serge-web/serge/blob/feature/333-game-admin-channel/tsconfig.json) 的根目录中有一个主 tsconfig 文件,然后每个包都有它自己的 tsconfig 文件,该文件扩展了该文件。 components 包的一个在这里:https://github.com/serge-web/serge/blob/feature/333-game-admin-channel/packages/components/tsconfig.json

我假设我错误地扩展了包中的 tsconfig 文件,或者我错误地使用了references,但我找不到正确的方法。

如果你需要查看结构,这里是一个 repo 的链接:https://github.com/serge-web/serge/tree/feature/333-game-admin-channel

【问题讨论】:

【参考方案1】:

我在类型目录中找到了 .ts。将扩展名从 filename.ts 更改为 filename.d.ts 解决了这个问题。所有其他文件都是这样命名的,它是旧代码,我不知道为什么那个文件的扩展名是 .ts 而不是 .d.ts

【讨论】:

成功了!谢谢你。也许您使用 .ts 而不是 d.ts 因为您的 *d.ts 文件没有经过类型检查?这就是使用 --skipLibCheck 时发生的情况。【参考方案2】:

唯一对我有用的是在 package.json 中明确添加包含外部代码的包作为依赖项:


    "dependencies": 
        "@packages/name": "*"
    

在我的设置中,我没有使用 Lerna,只使用带有 TypeScript 和 javascript 包的原始 Yarn 工作区。

【讨论】:

我正在尝试按照您的方式进行这项工作。你能详细说明一下吗?我不想使用路径别名,只需添加我自己的 monorepo 项目作为其他子项目的依赖项。那可能吗?谢谢! @Tirias 实际上是的。我知道实现这一目标的两种方法。 1) 将你的 monorepo 项目上传到 npm 然后npm i 他们。 2)使用“npm link”将您的项目符号链接为全局 npm dep(仅限本地)(docs.npmjs.com/cli/v7/commands/npm-link)。 无需使用路径别名和路径引用就可以像魅力一样工作。谢谢!【参考方案3】:

最后,修复是从除根目录中的 tsconfig.json 文件(我将其保留为 .)以外的所有文件中删除对 rootDir 的任何引用。

【讨论】:

虽然它确实解决了问题,但您不认为rootDir 的存在是有原因的吗?我的项目中有同样的问题,但我觉得删除 rootDir 并不安全。 这绝对是一个令人讨厌的答案,是的。 rootDir 是 typescript builder 用户用于输出文件夹的模式,因此删除它意味着我的构建文件夹不会以我想要的方式输出,但是我只是添加了另一个节点脚本来清理文件夹,它远非理想,但它可以完成工作。 请参阅 this answer 以获取有关 rootDir 的信息并使用项目参考。思考将开始变得更有意义。 我遇到了与 OP 相同的问题,一旦我完成了转换为项目参考的工作,一切都变得更加顺利!公平的警告,我确实需要一段时间才能理解如何正确配置所有内容(主要是修复我的 [bad] “变通办法”,以便将东西粘合在一起),但现在已经完成,它工作得很好。构建速度更快,与 webpack 和 ts-loader 没有冲突,保留了在其他子存储库中跳转到源代码的能力(使用 declarationMap 标志)等。

以上是关于monorepo 中的“'rootDir' 应包含所有源文件”的主要内容,如果未能解决你的问题,请参考以下文章

Monorepo 中的对等依赖关系

如何在同一个 monorepo 中的 Python 项目之间共享开发依赖项?

在 monorepo 中的多个应用程序之间共享组件时如何处理共享依赖项

Monorepo 中的 Jest 项目无法在项目中找到配置文件

如何在 Monorepo 中的 VueJS 项目之间共享组件

带有 Nextjs 和 React-native 的 monorepo 中的 Nohoist:无法解决反应