Typescript: دعم عدة tsconfig.json لكل مشروع

تم إنشاؤها على ٢٦ يونيو ٢٠١٥  ·  37تعليقات  ·  مصدر: microsoft/TypeScript

مرحبا! هل من الممكن استخدام عدة tsconfig.json لكل مشروع ، وهذا نوع من المشروع على مستوى tsconfig.json الموجود في الدليل الجذر وملفات tsconfig.json الإضافية الموجودة في الدلائل الفرعية التي قد تتجاوز / ضبط بعض الخيارات لذلك dirs؟ مثل .gitignore يفعل.

سيكون من المفيد جدًا ، على سبيل المثال ، تطوير وحدة خارجية تحت بيئة node . عادةً ما يتم تقسيم هذه الوحدات إلى ملفات متعددة (وحدات داخلية) ، ولكن سيتم تجميعها في ملف واحد كبير أثناء مرحلة التجميع.

Question

التعليق الأكثر فائدة

أخيرا حصلت على الحل.

هيكل التطبيق الخاص بي:
-- تطبيق/- التطبيق / العميل / (شفرة المصدر من جانب العميل)- التطبيق / الخادم / (شفرة المصدر من جانب الخادم)- التطبيق / البناء / (حيث أقوم بإنشاء js)- وحدات التطبيق / العقدة /- app / package.json- app / tsconfig.server.json- app / tsconfig.client.json

محتوى tsconfig.server.json:
{"compilerOptions": {...، "outDir": _ "build / server" _}،"استبعاد": ["node_modules"، "client"]}

محتوى tsconfig.client.json:
{"compilerOptions": {...، "outDir": "build / client"}،"استبعاد": ["node_modules"، "server"]}


ثم عندما أرغب في تجميع التعليمات البرمجية المصدر للخادم ، أستخدم هذا الأمر من دليل جذر التطبيق:

tsc --p tsconfig.server.json


ولتجميع الكود المصدري للعميل ، أيضًا من دليل التطبيق الجذر:

tsc --p tsconfig.client.json


من أجل تشغيل تجميع كل من العميل والخادم ، أضفت أمرًا في package.json:

"البرامج النصية": {...، "tsc": "tsc --p tsconfig.server.json && tsc --p tsconfig.client.json"، ...}

ثم لتجميع كل من الخادم والعميل ، قمت فقط بتشغيل هذا من دليل التطبيق الجذر الخاص بي:

npm تشغيل tsc

آمل أن يساعدك هذا التعليق :-)

ال 37 كومينتر

ياlazutkin. هذا غير مدعوم حاليًا ، على الرغم من أنني أريد فقط ربط هذه المشكلة بـ # 2869 لأنها مرتبطة إلى حد ما.

يختار المترجم أقرب tsconfig.json للمجلد الذي تقوم بإنشائه إذا كنت تقوم بتشغيل tsc بدون وسيطات في المجلد. لذلك إذا كان لديك مجلد داخلي به tsconfig.json فسيتم انتقاؤه قبل المجلد الموجود في الدليل الخارجي.

لا أعتقد أننا سندعم التكامل / تجاوز التكوين من tsconfig.json متعددة.

لا غنى عن ملفات tsconfig المتعددة لتطبيقات المؤسسات الكبيرة.
اقتراح: في كل مرة يعثر tsc على ملف tsconfig جديد في دليل فرعي ، يتوقف tsc هنا وينشئ عملية tsc جديدة بملف tsconfig الخاص به.

Eisenspalter يبدو هذا وكأنه وظيفة سائق بناء شيء مثل grunt أو gulp أو msbuild.

mhegazy أتفق مع Eisenspalter لأن كلانا لا نتحدث عن عملية البناء ولكن عن عملية التطوير بما في ذلك كتابة المصادر والاختبار والأنشطة الأخرى التي نحتاج إلى إكمالها قبل الإنشاء. في كل هذه الخطوات الوسيطة ، نحتاج إلى الحصول على دعم من typescript بما في ذلك التحسس والتحقق من الكتابة وما إلى ذلك. علاوة على ذلك ، كما قلت سابقًا ، بالنسبة لأجزاء مختلفة من المشروع ، نود تطبيق تقنيات تنظيم مختلفة للمصدر (وحدات خارجية - داخلية ، فردية ملف الإخراج ، وما إلى ذلك) وهنا نحتاج إلى بعض الخيارات ليتم تجاوزها بواسطة tsconfig منفصل.

mhegazy لماذا مغلق؟ يرجى إعادة الفتح.

يمكنك الحصول على tsconfig متعددة اليوم ، كل منها يشير إلى مجموعة متداخلة من الملفات. لذلك واحد في srctsconfig.json ، واحد في teststsconfig.json ، إلخ. سيحدد المترجم / الأدوات موقع الملف عن طريق السير في شجرة الدليل للعثور على أقرب واحد. حتى تتمكن من الحصول على ملف ثالث في الجذر لالتقاط كل شيء.

كل هذا يعمل اليوم ، في المترجم و IDEs المختلفة. كانت المشكلة الأصلية تتعلق بالسماح لملف بأن يرث من ملف آخر. لا أعتقد أن هناك قيمة كافية تستدعي التعقيد.

بالنسبة للعدد الثاني:

في كل مرة يعثر tsc على ملف tsconfig جديد في دليل فرعي ، يتوقف tsc هنا وينشئ عملية tsc جديدة بملف tsconfig الخاص به.

كما ذكرت سابقًا ، يمثل tsconfig.json استدعاءًا واحدًا لـ tsc.js / tsc.exe إذا كنت تريد إجراء استدعاءات متعددة ، فيجب عليك استخدام برنامج تشغيل بناء.

lazutkin و Eisenspalter هل هذا يجيب على الأسئلة

تضمين التغريدة
تعذر الحصول على tsconfig.json متعدد للعمل. على الأقل مع TypeScript 1.7.3 ، تتم قراءة tsconfig.json واحد فقط ومن المتوقع أن يكون في الدليل الجذر (أو الأصل) للمشروع.

Ziink تعليقي أعلاه لم يكن حول tsconfigs متعددة في نفس المشروع. كان الأمر يتعلق بمشاريع / أدلة متعددة ، لكل منها tsconfig مختلف. هذه هي الطريقة التي يتم بها تخطيط مشروع ts ، راجع https://github.com/Microsoft/TypeScript/tree/master/src ، كل مجلد ضمن src ، له tsconfig.json مختلف

لدي مشروع مكتوب بلغة TypeScript وأريد استهداف كليهما:

  1. متصفح (لنقل الملفات في /browser ) مع ES5 / AMD و
  2. nodejs (ملفات في server ) مع CommonJS والمولدات (وغير متزامن / انتظار في TS).

هناك بعض الملفات المشتركة دعنا نقول في مجلد ( /common ) وهناك واردات من common إلى browser و server .
كيف يمكنني تحقيق هذا التكوين للحفاظ على دعم IDE ، وجميع الأخطاء وما إلى ذلك؟ لست متأكدًا مما إذا كانت المناقشة قد أجابت عن شكوكي.

bartq باستخدام TS 1.8 ، أود إنشاء ملفين من ملفات tsconfig ، أحدهما للمتصفح والآخر للخادم ، وأضيف /// المراجع في ملفاتك في كلا المشروعين الفرعيين إلى الملفات الشائعة. جربه وأخبرنا إذا كان هذا يعالج السيناريو أو لا تزال هناك أجزاء مفقودة.

في الواقع أنا أستخدم هذين الملفين tsconfig.json ، يكتشفهما WebStorm ويدير التجميع تلقائيًا. لكي نكون دقيقين ، تستورد شفرة الواجهة الخلفية بعض الفئات من كود الواجهة (بدلاً من استخدام مفهوم common ) ، لكن كل ذلك يعمل بشكل جيد.

أخيرا حصلت على الحل.

هيكل التطبيق الخاص بي:
-- تطبيق/- التطبيق / العميل / (شفرة المصدر من جانب العميل)- التطبيق / الخادم / (شفرة المصدر من جانب الخادم)- التطبيق / البناء / (حيث أقوم بإنشاء js)- وحدات التطبيق / العقدة /- app / package.json- app / tsconfig.server.json- app / tsconfig.client.json

محتوى tsconfig.server.json:
{"compilerOptions": {...، "outDir": _ "build / server" _}،"استبعاد": ["node_modules"، "client"]}

محتوى tsconfig.client.json:
{"compilerOptions": {...، "outDir": "build / client"}،"استبعاد": ["node_modules"، "server"]}


ثم عندما أرغب في تجميع التعليمات البرمجية المصدر للخادم ، أستخدم هذا الأمر من دليل جذر التطبيق:

tsc --p tsconfig.server.json


ولتجميع الكود المصدري للعميل ، أيضًا من دليل التطبيق الجذر:

tsc --p tsconfig.client.json


من أجل تشغيل تجميع كل من العميل والخادم ، أضفت أمرًا في package.json:

"البرامج النصية": {...، "tsc": "tsc --p tsconfig.server.json && tsc --p tsconfig.client.json"، ...}

ثم لتجميع كل من الخادم والعميل ، قمت فقط بتشغيل هذا من دليل التطبيق الجذر الخاص بي:

npm تشغيل tsc

آمل أن يساعدك هذا التعليق :-)

لا أفهم ما هي المشكلة هنا. لماذا لا يمكننا دعم التكوينات بأسماء ملفات مختلفة؟ إنه لأمر مؤلم أن تضطر إلى إنشاء مجلدات فرعية فقط للحصول على ملف tsconfig مختلف.

تستطيع. --p يكون اسم الملف.

لن تعمل أسماء الملفات المختلفة مع امتداد برنامج التحويل البرمجي للطباعة في Visual Studio (لا نتحدث عن CLI) خارج الصندوق. الطريقة الوحيدة للقيام بذلك هي وضع كل ملف tsconfig.json في دليل وهمي ، وجعله يرتبط مرة أخرى بالنصوص المطبوعة التي تريدها باستخدام الخيار files .

فمثلا

- src / target / search / tsconfig.json
- src / target / core / tsconfig.json
--src / target / users / tsconfig.json

سيبدو target / search / tsconfig.json مشابهًا لما يلي:

{
  "compilerOptions": {
    "outFile": "../../../build/app/search.js"
  },
  "files": [
    "../../src/common",
    "../../src/search"
  ]
}

وسيكون الآخرون متشابهين.

سينتج هذا 3 ملفات جافا سكريبت ، لكل منها تكوينه الخاص للملفات المجمعة في ملف واحد.

بالطبع ، يمكنك استخدام حل تجميع / تصغير / تغليف مختلف عن برنامج التحويل البرمجي Typescript نفسه.

كل ما في الأمر أن برنامج التحويل البرمجي Typescript يقوم بعمل جيد حقًا مع التحسين - وهذا أحد أكبر عوامل الجذب لاستخدام Typescript.

لذلك ، سيكون من الجيد أن يدعم ملف tsconfig.json واحد تكوينات متعددة بمجرد تغييره ليكون مصفوفة من tsconfigs:

[
  {
    "compilerOptions": {
      "outFile": "../../build/search.js"
    },
    "files": [
      "src/common",
      "src/search"
    ],
    "compileOnSave": true
  },
  {
    "compilerOptions": {
      "outFile": "../../build/core.js"
    }
    "files": [
      "src/common",
      "src/core"
    ],
    "compileOnSave": true
  }
]

هذا ما يبدو أنه تم طلبه في التعليقات اللاحقة لهذه المشكلة ، على الرغم من أنني أوافق ، كانت المشكلة الأصلية تتعلق بالميراث وتجاوز التكوينات.

mhegazybartq لا أستطيع أن tsc .
لدي هيكل الدليل التالي

-- app/
-- app/server  -- here I want es6/commonjs
-- app/server/tsconfig.json
-- app/client    -- here I want es6/es6 
-- app/client/tsconfig.json
-- app/tsconfig.json

ومع ذلك ، عند تشغيل tsc يتم استخدام config فقط من app/tsconfig.json ، يتم تجاهل الباقي. أحاول أن أجعله يعمل في VSCode: /

tomitrescak أنا أستخدم WebStorm وهو ذكي بما يكفي للعثور على أقرب موقع tsconfig.json واستخدامه عند تحرير ملف. ربما لا توجد أي أداة cmd تدعم مشاهدة ملفات tsconfig.json المتعددة. يمكنك طرحه باستخدام حارس FB على سبيل المثال.

نعم ، أود الحصول على شيء مثل هذا في VS Code. أنا أدير التجميع في المحطة. يعمل كذلك. يحدد VS Code الأخطاء بشكل صحيح على أي حال.

تكوينات متعددة ستكون رائعة. أنا أعمل على مشروع React-Native ولدي بشكل أساسي بنائين أريد القيام بهما:

  1. نصوص مشروعي React-Native
  2. البرامج النصية المستخدمة في HTML لـ React-Native WebViews (الرسوم البيانية).

تمت إضافة وراثة التكوين في TS 2.1 ، ويجب أن تكون متاحة في typescript@next اليوم. راجع https://github.com/Microsoft/TypeScript/issues/9876 لمزيد من التفاصيل. مع ذلك يمكنك الحصول على tsconfig.json "رئيسي" وتجاوز تلك التي ترث التكوينات منه. ما زلت بحاجة إلى إنشاء عدة ملفات tsconfig.json ، ولكن يجب أن يلتقط IDE هذه الملفات.

لدي هيكل الدليل التالي:

├── examples
│   ├── files...
│   └── tsconfig.json
├── src
│   └──files...
└── tsconfig.json

جذر tsconfig.json يملك:

{
  "compilerOptions": {
    "target": "es2015",
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "declaration": true,
    "allowJs": false
  },
  "include": [
    "./src"
  ],
  "compileOnSave": false,
  "buildOnSave": false,
  "atom": { "rewriteTsconfig": false }
}

examples/tsconfig.json لها نفس القيمة باستثناء:

  "include": [
    "./hello-world"
  ],

عندما أفعل:

cd examples
tsc

يجمع:

├── examples
│   ├── dist
│   │   ├── examples
│   │   └── src
│   ├── files...
│   └── tsconfig.json
├── src
│   └──  files...
└── tsconfig.json

( dist خطأ يتضمن المجلد الخارجي src ويقوم بالتجميع من داخل المجلد الجذر)

لا يساعد هذا (في examples/tsconfig.json ):

  "exclude": [
    "../src"
  ],

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

لقد وجدت مشكلة. إذا كان هذا الاستيراد في examples/hello-world/any-file*.ts :

import { SomeClass } from '../../src';

انها تنتج المشكلة المذكورة أعلاه. بعد أعمال الاستيراد كما هو متوقع:

import { SomeClass } from '../../';

ولكن لماذا لا يعمل التوجيه المطبوع عليه include كما هو متوقع؟

لا يمكنني تشغيله
يصر على " تحذير: لا يمكن العثور على الأصل tsconfig.json" بالرغم من وجود tsconfig.json في نفس المجلد ، لا أعرف ماذا أفعل بهذا

zhukovka ، يرجى تسجيل مشكلة جديدة باستخدام repro مستقل يمكننا تشغيله محليًا

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

RyanCavanaugh، يبدو الدعم للترجمة مع عدة tsconfig.json مختلفة لمواصلة كن المطورين شيء أود أن يكون. بالنسبة لحالاتي ، يتعلق الأمر بشكل عام بتغيير مكان انتقال ملفات الإخراج التي تم إنشاؤها. يبدو أنه إذا كان من الممكن التحكم في أجيال الكود بشيء مثل التعيين الحالي paths مما يسمح لي بتخطيط الكود الخاص بي الذي تم إنشاؤه بشكل مختلف عن المصادر ، فربما يتم تقليل الحاجة إلى مشاريع متعددة.

حالة الاستخدام الخاصة بي هي أن لديّ قاعدة بيانات قديمة كبيرة لا يمكنها تحمل قواعد التحقق من النوع الأكثر صرامة ، وأريد استخدامها في قاعدة بيانات جديدة ، والتي _فعلها_ تم تمكين عمليات فحص صارمة ، ولا يمكنني ترجمة الكود القديم إلى مكتبة لأنها تحتوي على مليون حالة حيث لا تستورد جميع الأنواع المطلوبة لتسمية الأنواع الخاصة بصادراتها (# 9944). لذلك أريد فقط إضافة قاعدة الكود القديمة إلى قاعدة الكود الجديدة ، ولكن تم تجميعها وفقًا لقواعد أكثر مرونة. لا يمكن أن يكون هذا خطوتين تجميع مختلفتين ؛ فقط عندما يعمل المترجم على ملفات المصدر تحت دليل معين ، يجب أن يستخدم قواعد laxer.

بالنسبة لي ، فإن حالة الاستخدام هي وجود جزء من الريبو الذي يتم تشغيله باستخدام العقدة ويحتاج إلى تجميع وحدات Commonjs ، بينما يحتاج الجزء الآخر إلى التجميع إلى وحدات ES6 لتمكين اهتزاز الأشجار في ES6. التجربة ليست رائعة ، فهناك الكثير من الاختراق باستخدام متغيرات البيئة TS_NODE_PROJECT ، في حالتي. يبدو بالتأكيد وكأنه شيء يمكن أن يربك الجحيم من الشخص التالي الذي يحافظ عليه عندما أقوم في النهاية بتغيير المشاريع.

ما زلت أحب أن أرى هذا وقد تم حله. سيكون فوزًا كبيرًا للمشروعات الأكبر التي تتطلب ملفات tsconfig.json لكل وحدة داخل المشروع.

Robinfr ما الذي لا extends بالنسبة لك؟

فعلت. اكتشفت ذلك بعد هذا المنشور. ومع ذلك ، هناك شيء واحد يجب ملاحظته وهو أنه لم يعمل بدون تعيين include للملفات التي لا يتعين على k عادة ذلك لأنها تمر عبر حزمة الويب.

15 سبتمبر. 2017 الساعة 9:24 صباحًا في schreef Kitson Kelly [email protected] :

Robinfr https://github.com/robinfr ما يفعل يمتد ميزة https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#configuration-inheritance-with-extends لا يحل لك؟

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/Microsoft/TypeScript/issues/3645#issuecomment-329703706 ، أو قم بكتم صوت السلسلة https://github.com/notifications/unsubscribe-auth/AD90FLZKcHMJeFU0osJroT_yawlC1oTFIks5p .

يعمل kitsonk extending بشكل جيد ، على الرغم من أنني إذا لم أفعل شيئًا خاطئًا ، فلا بد لي من تكرار إعدادات معينة (باستثناء مجلدات الإنشاء و node_modules) في كلا التهيئة. بالنسبة لي ، فإن أكبر نقطة معاناة هي التأكد من أن جميع أدواتي تعرف ملف التكوين الصحيح الذي يتم استخدامه أيضًا (عادةً عن طريق شيء مثل متغير البيئة TS_NODE_PROJECT . والآخر هو عند فتح مشروع مع اثنين من tsconfigs في VS.code. لا توجد طريقة (أعرفها) لإخبار VS بملف المشروع الذي يجب استخدامه وهذا يعني أنه بالنسبة لبعض أخطاء الملفات لن يتم تسطيرها بشكل صحيح ، بسبب الإعدادات المختلفة لهذه الملفات في tsconfig المقابل (على سبيل المثال ، شيء ما مثل tsconfig.build.json).

voy هل لي أن أسأل لماذا لديك tsconfig مختلف للبناء؟ بقدر ما فهمت ، يستخدم VSCode أقرب ملف tsconfig ( tsconfig.json ) للملف الذي تقوم بتحريره. المشكلة الوحيدة التي واجهتها حتى الآن هي أنك تحتاج إلى أن يكون لديك ملف tsconfig في الجذر قبل أن يبدو أن VSCode يبدأ في استخدام التكوينات على الإطلاق ...

تضمين التغريدة في نفس المستودع لدي ملفات تتم معالجتها باستخدام webpack & babel واستخدام وحدات ES6 لتمكين اهتزاز الشجرة. تعد الملفات الأخرى جزءًا من عملية الإنشاء ويتم تنفيذها باستخدام العقدة ، ولهذا السبب يجب تحويل الواردات إلى تتطلب. لست متأكدا كيف يمكنني التغلب على ذلك.

voy ألن يكون لديك هذه الملفات في مجلد منفصل ولكن؟ على سبيل المثال ، مجلد واحد لجميع ملفات Babel & webpack ، ومجلد واحد لملفات العقدة. ثم يمكنك فقط الحصول على tsconfig.json لكل من هذه المجلدات. ألن يعمل هذا من أجلك؟

Robinfr سيكون ذلك مثاليًا ، لكنني أعتقد أنه ليس ممكنًا دائمًا في العالم الحقيقي. على سبيل المثال ، نريد أن تكون جميع ملفات التكوين الخاصة بنا مطبوعة أيضًا ، وأن يتم تجميعها وفحصها وفقًا للقواعد نفسها تمامًا مثل جميع التعليمات البرمجية TypeScript ويجب أن تكون بعض الملفات في جذر المشروع. يمكنك إنشاء ارتباط رمزي ، ولكن هذا يؤدي أحيانًا إلى ظهور مشكلات أخرى. لهذا أشعر أن شيئًا أكثر مرونة سيكون مفيدًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات