TypeScript - الخطأ TS6059: الملف ليس ضمن 'rootDir' .. من المتوقع أن يحتوي 'rootDir' على جميع ملفات المصدر


أنا أحصل على هذا الخطأ الغير منطقي إلى حد ما في التحويل باستخدام tsc:

خطأ TS6059: الملف '/Users/alex/codes/interos/teros-cli/src/logging.ts' ليس تحت 'rootDir' '/Users/alex/codes/teros/notifier-server/src'. من المتوقع أن يحتوي 'rootDir' على جميع ملفات المصدر.

الدليل الحالي الخاص بي هو /Users/alex/codes/teros/notifier-server هو:

{
  "compilerOptions": {
    "outDir": "dist",
    "allowJs": false,
    "pretty": true,
    "resolveJsonModule": true,
    "sourceMap": false,
    "skipLibCheck": true,
    "rootDir": "src",
    "declaration": false,
    "baseUrl": ".",
    "target": "es2018",
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "allowUnreachableCode": true,
    "lib": [
      "es2017",
      "es2018"
    ]
  },
  "compileOnSave": false,
  "include": [
    "src"
  ]
}

يبدو أن هذا خطأ.. نظرًا لأن دليل teros-cli خارج دليل العمل الحالي، ويتم التحكم فيه بواسطة ملف tsconfig.json منفصل.

لقد قمت بتغيير هذا الحقل أيضًا إلى:

  "include": [
    "/Users/alex/codes/teros/notifier-server/src"
  ],
  "exclude": [
    "/Users/alex/codes/teros/teros-cli"
  ]

ما زلت أحصل على نفس الخطأ.

الإجابة رقم 1

ما هو rootDir؟

rootDir يتم تعيينه إلى مجلد جذر، يحتوي على جميع ملفات المصدر الخاصة بك. إذا لم يتم تحديده، سيقوم TS تلقائيًا باختيار مجلد أصلي مناسب لجميع المدخلات. rootDir يحدد أيضًا دليل الإخراج.

ماذا يعني هذا الخطأ؟

تخميناتي هو أن لديك بيان import لـ logging.ts في مكان ما داخل notifier-server:

import {logger} from "@teros-cli/logging" // or similar

ثم سيتم تضمين وحدة logging.ts بشكل تلقائي من قبل المجمع، بغض النظر عن خيارات include وexclude في tsconfig.json. إحدى الطرق للتحقق من جميع الملفات المضمنة هي tsc --listFiles.

ملف tsconfig.json الموجود خارج notifier-server لا يفيد هنا. المجمع يلتقط بالضبط إعدادًا واحدًا لكل عملية تجميع tsc ويسحب إعدادات موروثة بشكل اختياري. إذا لم يتمكن من العثور على واحد في جذر مشروع notifier-server (حيث بدأت tsc)، عندها فقط يبحث المجمع صعودًا في سلسلة الدليل الأبوي، حتى يتم العثور على إعداد.

الحلول الممكنة

أحد الحلول هو مجرد إزالة "rootDir": "src" من خيارات المترجم، حتى يتم تعيينه تلقائيًا. تحذير: بعد ذلك سيعتبر rootDir كلا المشروعين كمدخلات!

بديل: يمكنك إضافة وحدة logging.ts منفصلة موجودة في مشروع notifier-server/src وحذف import الخارجي.

آمل أن يكون ذلك مفيدًا!

الإجابة رقم 2

عند استخدام NX

انتهى بي المطاف هنا لكن لم تساعد أي من الإجابات حالتي.

أنا أستخدم NX monorepo، وكانت المشكلة هي أن حقل "name" في package.json للمكتبة الخاصة بي كان مضبوطًا على اسم مشروع المكتبة (نفس اسم project.json).

من الواضح أن هذا كان يسبب المشكلة واضطررت إلى إعادة تسميته إلى نفس المسار المحدد في tsconfig.base.json