【发布时间】:2019-08-27 17:04:17
【问题描述】:
我正在尝试使用 yarn 建立一个 monorepo。我对如何使用项目引用设置打字稿以使事情正确解决感到困惑。
例如,如果我有一个类似的文件夹结构
/cmd
/client
我希望 cmd 依赖于 client 我可以:
cmd/tsconfig.json:
{
"compilerOptions": {
"types": ["reflect-metadata", "jest"],
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"moduleResolution": "node",
"declaration": true,
"importHelpers": true,
"composite": true,
"target": "esnext"
"sourceRoot": "src",
"outDir": "dist"
},
"references": [
{
"path": "../client"
}
],
"include": [
"src/**/*"
]
}
package.json
{
"name": "cmd",
"version": "1.0.0",
"dependencies": {
"client": "^1.0.0",
}
}
在此模型中,cmd 和 client 都在其 tsconfig 中使用 outDir 和 sourceRoot 字段集进行编译。这意味着他们所有编译的 javascript 都会进入 cmd/dist 和 client/dist 的 dist/ 子文件夹
如果现在我尝试将 client 中的类引用到 cmd 中
import Foo from 'client/src/foo'
IDE 非常乐意解决这个问题,因为它似乎是通过 typescript references 属性映射的。
然而,编译后的 javascript 归结为一个
const foo_1 = require("client/src/foo");
但是,实际构建的 javascript 在 client/dist/src/foo 中,因此在运行时这永远不会起作用。
另一方面,如果我不使用 sourceRoots 和 outDirs 并且将 javascript 与 typescript 文件内联在同一个文件夹中,那么一切都可以正常工作(但会使 repo 变脏并且需要自定义 gitignores 来排除东西)
任何人都可以阐明如何正确设置带有纱线工作区的 typescript 3.x monorepo 以使事情正常工作吗?
【问题讨论】:
-
旁注:我使用lerna 设置了一个monorepo,发现它非常有价值,它也应该适用于yarn。 (我将它与 npm 一起使用。)
-
我记得处理过这样的事情。如果您想发布一个可以重现问题的存储库链接,我会看看。
-
看看这个 repo。他们做得很好。仔细看github.com/apollographql/apollo-client
标签: node.js typescript yarnpkg yarn-workspaces