Я предлагаю использовать линтер для этой работы, нет необходимости настраивать этап сборки или использовать ссылки на проекты.
eslint-plugin-import
- довольно популярный плагин ESLint, совместимый с TS и может делать то, что вы хотите . После настройки typescript-eslint (если это еще не сделано), вы можете поиграть со следующими правилами:
Давайте попробуем со следующей структурой проекта:
| .eslintrc.js
| package.json
| tsconfig.json
\---src
+---common
| common.ts
|
+---projectA
| a.ts
|
\---projectB
b.ts
.eslintrc.js:
module.exports = {
extends: ["plugin:import/typescript"],
parser: "@typescript-eslint/parser",
parserOptions: {
sourceType: "module",
project: "./tsconfig.json",
},
plugins: ["@typescript-eslint", "import"],
rules: {
"import/no-restricted-paths": [
"error",
{
basePath: "./src",
zones: [
// disallow import from projectB in common
{ target: "./common", from: "./projectB" },
// disallow import from projectB in projectA
{ target: "./projectA", from: "./projectB" },
],
},
],
"import/no-relative-parent-imports": "error",
},
};
Каждая зона состоит из целевого пути и от пути. Цель - это путь, по которому должен применяться ограниченный импорт. Путь from определяет папку, которую нельзя использовать при импорте.
Просмотр файла ./src/common/common.ts
:
import { a } from "../projectA/a"; // works
// Error: Unexpected path "../projectB/b" imported in restricted zone.
import { b } from "../projectB/b";
Правило import/no-relative-parent-imports
также нарушает оба импорта, например a.ts
:
Относительный импорт из родительских каталогов не допускается. Пожалуйста, либо передайте то, что вы импортируете, во время выполнения (внедрение зависимостей), переместите common.ts
в тот же каталог, что и ../projectA/a
, или подумайте о создании ../projectA/a
пакета.
Третье правило import/no-internal-modules
не использовалось, но я также перечисляю его здесь, поскольку может быть очень полезно ограничить доступ к дочерним папкам / модулям и имитировать (по крайней мере) какой-то внутренний модификатор пакета в TS.
person
ford04
schedule
27.04.2020