تایپاسکریپت - چگونه یک فایل مشخص را با استفاده از گزینه کامپایلر paths با tsc کامپایل کنیم
من چندین فایل دارم که میخواهم با استفاده از یک اسکریپت آنها را کامپایل کنم. این فایلها برای حل ماژولهای خود به گزینهی paths کامپایل وابسته هستند. چون میخواهم به طور خاص این فایلها را هدف قرار دهم، مجبورم آنها را به tsc ارائه دهم (زیرا نمیخواهم یک tsconfig.json جداگانه ایجاد کنم که این فایلها را برای این کار هدف قرار دهد)
من گزینه ارسال پارامتر --path به tsc را بررسی کردهام، اما این مجاز نیست (error TS6064: گزینه 'paths' تنها میتواند در فایل 'tsconfig.json' مشخص شود.)
آیا میتوانم به نوعی فقط فایلهای خاص .ts را هنگام استفاده از گزینه paths کامپایل کنم؟
بهروزرسانی (17-06-22)
بر اساس درخواست، چند مثال مشخص:
تنظیمات مرتبط در فایل tsconfig.json به شرح زیر هستند:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"Components/*": [
"./src/Components/*"
]
}
}
}
بنابراین بخش مرتبط، تنظیمات مسیرها است، جایی که میتوانید میانبرهایی برای وارد کردن فایلها از یک دایرکتوری خاص ایجاد کنید. بنابراین میتوانید یک فایل را مثل import {header} from 'Components/header.ts' وارد کنید به جای import {header} from '../../Components/header.ts'
اما من نیاز دارم فایلهای خاصی را از خط فرمان کامپایل کنم. اما اگر تلاش کنم:
tsc --project tsconfig.json entryFile.ts
این خطا را به من میدهد:
error TS5042: Option 'project' cannot be mixed with source files on a command line.
و اگر بخواهم گزینه paths را به خط فرمان ارائه کنم، خطای زیر را دریافت میکنم:
error TS6064: Option 'paths' can only be specified in 'tsconfig.json' file.
پاسخ شماره ۱
تعیین فایلهای ورودی در خط فرمان باعث بیاعتبار شدن tsconfig.json شما میشود.
وقتی فایلهای ورودی در خط فرمان مشخص شوند، فایلهای tsconfig.json نادیده گرفته میشوند.
از مستندات TypeScript.
پس، هیچ گزینهی دیگری جز استفاده از یک فایل tsconfig.json با مشخصات صحیح 'include' (یا exclude) برای فایلها وجود ندارد. خبر خوب این است که در همان مستندات شما میتوانید پیدا کنید:
یک فایل tsconfig.json میتواند از طریق ویژگی extends پیکربندیها را از فایل دیگری به ارث ببرد.
پس کاری که شما میتوانید انجام دهید این است که ویژگی include در tsconfig خود را با چیزی شبیه به این بازنویسی کنید:
{
"extends": "./tsconfig.json",
"include": [
"src/root/index.ts"
]
}
پس میتوانستی یک اسکریپت بسازی که:
- یک فایل موقت 'extends tsconfig' با ویژگی 'include' موردنظر ایجاد میکند
- فراخوانی
tscبا--projectکه به عنوان آن tsconfig موقتی مشخص شده است
میتوان گفت که این بسیار پیچیده است و پرسید چرا آنها تصمیم گرفتند این سناریو را بهدرستی پشتیبانی نکنند. با این حال، سؤال همچنان باقی میماند که چرا کسی بخواهد فقط یک فایل از یک پروژه را کامپایل کند. هنگام توسعه، میتوانید از گزینه watch (-w) برای کامپایل فایلهای تغییر یافته استفاده کنید و هنگام ساخت یک پروژه کامل، احتمالاً میخواهید دقیقاً همان پروژه کامل را کامپایل کنید.
پاسخ شماره ۲
من نیز در نیاز مشابهی بودم تا اطمینان حاصل کنم پروژه با استفاده از lint-staged کامپایل خواهد شد. اگر ترکیب tsconfig.json و مسیرهای فایل مجاز بود، میتوانستید از "tsc" مستقیماً به عنوان یک دستور lint-staged استفاده کنید.
به عنوان یک راه حل موقت، اسکریپت کمکی زیر را ایجاد کردم scripts/tsc-lint.sh:
#!/bin/bash -e
TMP=.tsconfig-lint.json
cat >$TMP <<EOF
{
"extends": "./tsconfig.json",
"include": [
EOF
for file in "$@"; do
echo " \"$file\"," >> $TMP
done
cat >>$TMP <<EOF
"unused"
]
}
EOF
tsc --project $TMP --skipLibCheck --noEmit
سپس تنظیمات lint-staged شامل موارد زیر است:
"lint-staged": {
"{src,tests}/**/*.ts": [
"scripts/tsc-lint.sh"
]
},
فایل .tsconfig-lint.json به .gitignore اضافه شده است.
پاسخ شماره ۳
فقط برای گسترش پاسخ @Bram...
کاری که در پروژهام انجام میدهم این است که دو tsconfig دارم:
project/
dist/
docs/
src/
package.json
tsconfig.json
tsconfig-build.json
پس من یک tsconfig-build.json دارم (چون نمیخواهم docs/ در بیلد من گنجانده شود):
// tsconfig-build.json
{
"extends": "./tsconfig.json",
"include": [
"src/**/*"
]
}
سپس میتوانید یک خط در package.json داشته باشید:
// package.json
...
"scripts": {
...
"build": "tsc -p tsconfig-build.json"
},
