防止在 Monorepo 中复制 Typescript 路径配置
Prevent Duplicating Typescript Path Configurations in Monorepo
要点
我喜欢遵循 "dry"(不要重复自己)原则。但目前我在三个不同的地方有几乎相同的路径配置:
1。打字稿配置文件
我有一个带有多个 Bazel Typescript 包的 monorepo,因此我需要在 tsconfig.json
中用这样的路径引用它们
"paths": {
"@cents-ideas/enums": ["./packages/enums"],
"@cents-ideas/utils": ["./packages/utils"],
"@cents-ideas/event-sourcing": ["./packages/event-sourcing"],
"@cents-ideas/models": ["./packages/models"]
},
2。节点包文件
为了使用 ts-node
进行开发,我还需要将路径添加到 package.json
以便 Node.Js 可以识别 Typescript 别名。 (我为此使用了一个名为 module-alias 的包。
"_moduleAliases": {
"@cents-ideas/enums": "./packages/enums",
"@cents-ideas/utils": "./packages/utils",
"@cents-ideas/event-sourcing": "./packages/event-sourcing",
"@cents-ideas/models": "./packages/models"
}
3。 Jest 配置文件
最后我还需要将这些路径添加到我的 Jest 配置中,以便测试可以找到路径:
moduleNameMapper: {
'^@cents-ideas/utils(.*)$': '<rootDir>/packages/utils',
'^@cents-ideas/event-sourcing(.*)$': '<rootDir>/packages/event-sourcing',
'^@cents-ideas/enums(.*)$': '<rootDir>/packages/enums',
'^@cents-ideas/models(.*)$': '<rootDir>/packages/models',
},
目标
我的目标是有一个可以放置路径的公共位置,所有其他位置都会自动更新。
如果您需要进一步了解该项目,可以在此处查看:https://github.com/flolude/cents-ideas
您正在使用 yarn,所以您可能应该看看 yarn workspaces。您应该可以添加
package.json
{
//...
"workspaces": [
"packages/*
]
}
和运行 yarn
,这将使符号链接成为node_modules
,你应该能够删除上面的所有三个配置
Typescript 配置文件
"paths": {
"@cents-ideas/*": ["./packages/*"]
},
节点包文件
const moduleAlias = require('module-alias');
const registerAliases = () => {
if (process.env.ENV === 'dev') {
const fs = require('fs');
const paths: string[] = fs.readdirSync('./packages');
paths.forEach(addPackageAlias);
}
};
const addPackageAlias = (name: string) => {
moduleAlias.addAlias(`@cents-ideas/${name}`, `${__dirname}../../../packages/${name}`);
};
registerAliases();
Jest 配置文件
已在 Bazel 的帮助下修复。但我确信 Jest 支持与 Typescript 配置类似的通配符。
要点
我喜欢遵循 "dry"(不要重复自己)原则。但目前我在三个不同的地方有几乎相同的路径配置:
1。打字稿配置文件
我有一个带有多个 Bazel Typescript 包的 monorepo,因此我需要在 tsconfig.json
"paths": {
"@cents-ideas/enums": ["./packages/enums"],
"@cents-ideas/utils": ["./packages/utils"],
"@cents-ideas/event-sourcing": ["./packages/event-sourcing"],
"@cents-ideas/models": ["./packages/models"]
},
2。节点包文件
为了使用 ts-node
进行开发,我还需要将路径添加到 package.json
以便 Node.Js 可以识别 Typescript 别名。 (我为此使用了一个名为 module-alias 的包。
"_moduleAliases": {
"@cents-ideas/enums": "./packages/enums",
"@cents-ideas/utils": "./packages/utils",
"@cents-ideas/event-sourcing": "./packages/event-sourcing",
"@cents-ideas/models": "./packages/models"
}
3。 Jest 配置文件
最后我还需要将这些路径添加到我的 Jest 配置中,以便测试可以找到路径:
moduleNameMapper: {
'^@cents-ideas/utils(.*)$': '<rootDir>/packages/utils',
'^@cents-ideas/event-sourcing(.*)$': '<rootDir>/packages/event-sourcing',
'^@cents-ideas/enums(.*)$': '<rootDir>/packages/enums',
'^@cents-ideas/models(.*)$': '<rootDir>/packages/models',
},
目标
我的目标是有一个可以放置路径的公共位置,所有其他位置都会自动更新。
如果您需要进一步了解该项目,可以在此处查看:https://github.com/flolude/cents-ideas
您正在使用 yarn,所以您可能应该看看 yarn workspaces。您应该可以添加
package.json
{
//...
"workspaces": [
"packages/*
]
}
和运行 yarn
,这将使符号链接成为node_modules
,你应该能够删除上面的所有三个配置
Typescript 配置文件
"paths": {
"@cents-ideas/*": ["./packages/*"]
},
节点包文件
const moduleAlias = require('module-alias');
const registerAliases = () => {
if (process.env.ENV === 'dev') {
const fs = require('fs');
const paths: string[] = fs.readdirSync('./packages');
paths.forEach(addPackageAlias);
}
};
const addPackageAlias = (name: string) => {
moduleAlias.addAlias(`@cents-ideas/${name}`, `${__dirname}../../../packages/${name}`);
};
registerAliases();
Jest 配置文件
已在 Bazel 的帮助下修复。但我确信 Jest 支持与 Typescript 配置类似的通配符。