Typescript: Dukungan untuk beberapa tsconfig.json per proyek

Dibuat pada 26 Jun 2015  Β·  37Komentar  Β·  Sumber: microsoft/TypeScript

Hai! Apakah mungkin untuk menggunakan lebih dari satu tsconfig.json per proyek, itu adalah sejenis proyek tsconfig.json di seluruh proyek yang terletak di direktori root dan tambahan tsconfig.json file yang terletak di sub-direktori yang mungkin menimpa / tune beberapa opsi untuk dirs itu? Seperti .gitignore .

Ini akan sangat berguna ketika, misalnya, mengembangkan modul eksternal di bawah node -environment. Modul seperti ini biasanya dipecah menjadi beberapa file (modul internal), tetapi akan dikompilasi menjadi satu file besar selama tahap kompilasi.

Question

Komentar yang paling membantu

Saya akhirnya mendapatkan solusinya.

struktur lamaran saya:
-- aplikasi/- app / client / (kode sumber sisi klien saya)- app / server / (kode sumber sisi server saya)- app / build / (tempat saya menghasilkan js)- app / node-modules /- app / package.json- app / tsconfig.server.json- app / tsconfig.client.json

Konten tsconfig.server.json:
{"compilerOptions": {..., "outDir": _ "build / server" _},"exclude": ["node_modules", "client"]}

Isi dari tsconfig.client.json:
{"compilerOptions": {..., "outDir": "build / client"},"exclude": ["node_modules", "server"]}


Kemudian ketika saya ingin mengkompilasi kode sumber server saya menggunakan perintah ini dari direktori root aplikasi:

tsc --p tsconfig.server.json


Dan untuk mengompilasi kode sumber klien, juga dari direktori aplikasi root:

tsc --p tsconfig.client.json


Untuk menjalankan kompilasi klien & server, saya menambahkan perintah di package.json:

"skrip": {..., "tsc": "tsc --p tsconfig.server.json && tsc --p tsconfig.client.json", ...}

Kemudian untuk mengkompilasi server dan klien saya hanya menjalankan ini dari direktori aplikasi root saya:

npm jalankan tsc

Semoga komentar ini dapat membantu Anda :-)

Semua 37 komentar

Hai @lazut. Saat ini, hal itu tidak didukung, meskipun saya hanya ingin menautkan masalah ini ke # 2869 karena agak terkait.

Kompilator memilih tsconfig.json yang paling dekat dengan folder yang Anda buat jika Anda menjalankan tsc tanpa argumen di folder. jadi jika Anda memiliki direktori dalam dengan tsconfig.json itu akan diambil sebelum direktori di luar direktori.

Saya rasa kami tidak akan mendukung integrasi / konfigurasi utama dari beberapa tsconfig.json.

Beberapa file tsconfig sangat diperlukan untuk aplikasi perusahaan besar.
Saran: Setiap kali tsc menemukan file tsconfig baru di subdirektori, tsc berhenti di sini dan membuat proses tsc baru dengan file tsconfignya sendiri.

@Eisenspalter ini terdengar seperti pekerjaan membangun driver seperti grunt, gulp atau msbuild.

@mhegazy Saya setuju dengan @Eisenspalter karena kami berdua tidak berbicara tentang proses pembangunan tetapi tentang proses pengembangan termasuk penulisan sumber, pengujian, dan kegiatan lain yang perlu kami selesaikan sebelum membangun. Pada semua langkah perantara ini kita perlu mendapatkan dukungan dari typescript termasuk intellisense, typechecking dll. Selain itu seperti yang saya katakan sebelumnya, untuk bagian proyek yang berbeda kami ingin menerapkan teknik pengorganisasian sumber yang berbeda (modul eksternal-internal, tunggal output file, dll) dan di sini kita memerlukan beberapa opsi untuk diganti dengan tsconfig terpisah.

@mhegazy Mengapa ditutup? Harap buka kembali.

Anda dapat memiliki beberapa tsconfig hari ini, masing-masing mengarah ke kumpulan file yang tumpang tindih. jadi satu di srctsconfig.json, satu di teststsconfig.json, dll. compiler / tools akan mencari file dengan berjalan ke atas pohon direktori untuk menemukan yang terdekat. sehingga Anda dapat memiliki file ketiga di root untuk menampung semua.

Ini semua berfungsi hari ini, di kompiler dan IDE yang berbeda. masalah aslinya adalah tentang mengizinkan file untuk mewarisi dari file lain. saya rasa tidak ada cukup nilai yang menjamin kerumitan.

Untuk masalah kedua:

Setiap kali tsc menemukan file tsconfig baru di subdirektori, tsc berhenti di sini dan membuat proses tsc baru dengan file tsconfignya sendiri.

Seperti yang saya sebutkan sebelumnya, tsconfig.json mewakili satu pemanggilan ke tsc.js / tsc.exe jika Anda ingin melakukan beberapa pemanggilan, Anda harus menggunakan driver build.

@lazutkin dan @Eisenspalter melakukan ini untuk menjawab pertanyaan

@bayu_joo
Tidak bisa membuat beberapa tsconfig.json bekerja. Setidaknya dengan TypeScript 1.7.3, hanya satu tsconfig.json yang dibaca dan diharapkan ada di direktori root (atau induk) proyek.

@Ziink, komentar saya di atas bukanlah tentang beberapa tsconfigs dalam proyek yang sama. ini tentang beberapa proyek / direktori, masing-masing dengan tsconfig yang berbeda. ini bagaimana proyek ts diatur, lihat https://github.com/Microsoft/TypeScript/tree/master/src , setiap folder di bawah src, memiliki tsconfig.json yang berbeda

Saya memiliki proyek yang ditulis dalam TypeScript dan saya ingin menargetkan keduanya:

  1. browser (katakanlah file dalam /browser ) dengan ES5 / AMD dan
  2. nodejs (file di server ) dengan CommonJS dan generator (dan async / await di TS).

Ada beberapa file bersama katakanlah di folder ( /common ) dan ada impor dari common menjadi browser dan server .
Bagaimana saya bisa mencapai konfigurasi yang melestarikan dukungan IDE, semua kesalahan, dll? Saya tidak yakin apakah diskusi menjawab keraguan saya.

@bartq Dengan TS 1.8, saya akan membuat dua file tsconfig, satu untuk browser, dan satu untuk server, dan menambahkan /// referensi di file Anda di kedua sub-proyek ke yang umum. mencobanya dan beri tahu kami jika ini mengatasi skenario atau masih ada bagian yang hilang.

sebenarnya saya menggunakan dua file tsconfig.json , WebStorm menemukannya dan menjalankan kompilasi secara otomatis. Tepatnya, kode backend mengimpor beberapa classess dari kode frontend (alih-alih menggunakan common concept), tetapi semuanya berfungsi dengan baik.

Saya akhirnya mendapatkan solusinya.

struktur lamaran saya:
-- aplikasi/- app / client / (kode sumber sisi klien saya)- app / server / (kode sumber sisi server saya)- app / build / (tempat saya menghasilkan js)- app / node-modules /- app / package.json- app / tsconfig.server.json- app / tsconfig.client.json

Konten tsconfig.server.json:
{"compilerOptions": {..., "outDir": _ "build / server" _},"exclude": ["node_modules", "client"]}

Isi dari tsconfig.client.json:
{"compilerOptions": {..., "outDir": "build / client"},"exclude": ["node_modules", "server"]}


Kemudian ketika saya ingin mengkompilasi kode sumber server saya menggunakan perintah ini dari direktori root aplikasi:

tsc --p tsconfig.server.json


Dan untuk mengompilasi kode sumber klien, juga dari direktori aplikasi root:

tsc --p tsconfig.client.json


Untuk menjalankan kompilasi klien & server, saya menambahkan perintah di package.json:

"skrip": {..., "tsc": "tsc --p tsconfig.server.json && tsc --p tsconfig.client.json", ...}

Kemudian untuk mengkompilasi server dan klien saya hanya menjalankan ini dari direktori aplikasi root saya:

npm jalankan tsc

Semoga komentar ini dapat membantu Anda :-)

Saya tidak mengerti apa masalahnya di sini. Mengapa kami tidak dapat mendukung konfigurasi dengan nama file yang berbeda? Sungguh merepotkan harus membuat subFolder HANYA untuk memiliki file tsconfig yang berbeda.

Kamu bisa. --p argumen ca menjadi nama file.

Nama file yang berbeda tidak akan berfungsi dengan ekstensi compiler skrip Visual Studio (tidak berbicara tentang CLI) di luar kotak. Satu-satunya cara untuk melakukannya adalah dengan meletakkan setiap tsconfig.json dalam direktori tiruan, dan menautkannya kembali ke skrip jenis yang Anda inginkan dengan opsi files .

sebagai contoh

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

target / search / tsconfig.json akan terlihat seperti ini:

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

Dan yang lainnya akan serupa.

Ini akan menghasilkan 3 file javascript, masing-masing dengan konfigurasi file sendiri, digabungkan menjadi satu.

Tentu saja, Anda dapat menggunakan solusi bundling / meminimalkan / pengemasan yang berbeda dari compiler Typecript itu sendiri.

Hanya saja compiler Typecript melakukan pekerjaan yang sangat baik dengan pengoptimalan - itulah salah satu daya tarik terbesar untuk menggunakan Typecript.

Jadi, alangkah baiknya jika satu tsconfig.json dapat mendukung beberapa konfigurasi dengan hanya mengubahnya menjadi sebuah array 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
  }
]

Kedengarannya seperti inilah yang diminta di komentar selanjutnya dari masalah ini, meskipun saya setuju, masalah aslinya lebih banyak tentang warisan dan konfigurasi utama.

@mhegazy @bartq Saya tidak dapat membuatnya bekerja dengan perintah tsc .
Saya memiliki struktur direktori berikut

-- 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

Namun, ketika saya menjalankan tsc hanya konfigurasi dari app/tsconfig.json yang digunakan, sisanya diabaikan. Saya mencoba membuatnya berfungsi di VSCode: /

@tomitrescak Saya menggunakan WebStorm dan cukup cerdas untuk menemukan tsconfig.json terdekat dan menggunakannya saat Anda mengedit file. Mungkin tidak ada alat cmd yang mendukung menonton beberapa tsconfig.json. Anda dapat meluncurkannya menggunakan misalnya penjaga FB.

Ya, saya ingin memiliki sesuatu seperti ini di VS Code. Saya menjalankan kompilasi di terminal. Bekerja dengan baik. VS Code dengan benar mengidentifikasi kesalahan.

Beberapa konfigurasi akan sangat bagus. Saya sedang mengerjakan proyek React-Native dan pada dasarnya saya memiliki dua build yang ingin saya lakukan:

  1. skrip proyek React-Native saya
  2. skrip yang digunakan dalam HTML untuk React-Native WebView (grafik).

Warisan konfigurasi telah ditambahkan di TS 2.1, dan seharusnya tersedia di typescript@next hari ini. lihat https://github.com/Microsoft/TypeScript/issues/9876 untuk lebih jelasnya. Dengan itu Anda dapat memiliki "master" tsconfig.json dan menimpa yang mewarisi konfigurasi darinya. Anda masih perlu membuat beberapa file tsconfig.json, tetapi IDE Anda harus mengambilnya.

Saya memiliki struktur direktori berikut:

β”œβ”€β”€ examples
β”‚   β”œβ”€β”€ files...
β”‚   └── tsconfig.json
β”œβ”€β”€ src
β”‚   └──files...
└── tsconfig.json

Root tsconfig.json memiliki:

{
  "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 memiliki nilai yang sama kecuali:

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

Ketika saya melakukan:

cd examples
tsc

Ini mengkompilasi:

β”œβ”€β”€ examples
β”‚   β”œβ”€β”€ dist
β”‚   β”‚   β”œβ”€β”€ examples
β”‚   β”‚   └── src
β”‚   β”œβ”€β”€ files...
β”‚   └── tsconfig.json
β”œβ”€β”€ src
β”‚   └──  files...
└── tsconfig.json

( dist salah termasuk folder eksternal src dan dikompilasi dari dalam folder root)

Tidak membantu ini (dalam examples/tsconfig.json ):

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

Apa yang saya lakukan salah?

Saya menemukan masalah. Jika dalam examples/hello-world/any-file*.ts saya impor ini:

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

Ini menghasilkan masalah yang dijelaskan di atas. Impor berikut berfungsi seperti yang diharapkan:

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

Tetapi mengapa petunjuk ketikan include tidak berfungsi seperti yang diharapkan?

Saya tidak bisa membuatnya bekerja
Ini bersikeras " Peringatan: Tidak dapat menemukan tsconfig.json induk" meskipun saya memiliki tsconfig.json di folder yang sama, tidak tahu apa yang harus dilakukan dengan ini

@zhukovka harap catat masalah baru dengan repro mandiri yang dapat kami jalankan secara lokal

@Ryanavana Oh. terima kasih, saya sudah menemukan jawabannya
masalah mereproduksi hanya jika saya memiliki satu file yang terbuka dari folder uji (yang tidak menyertakan tsconfig.json) dan file kedua dibuka di folder 'src' (yang menyertakan tsconfig.json)
dan file dari folder pengujian mengimpor file dari folder src. Dalam kasus ini, file dari folder src tidak melihat 'parent tsconfig.json' miliknya

@RyanCavanaugh , dukungan untuk kompilasi dengan beberapa tsconfig.json yang berbeda tampaknya terus menjadi sesuatu yang ingin dimiliki pengembang. Untuk kasus saya, umumnya tentang mengubah ke mana perginya file output yang dihasilkan. Sepertinya jika pembuatan kode dapat dikontrol oleh sesuatu seperti pemetaan paths memungkinkan saya untuk mengatur tata letak kode yang saya hasilkan secara berbeda dari sumber, mungkin kebutuhan untuk beberapa proyek akan berkurang.

Kasus penggunaan saya adalah saya memiliki basis kode lama yang besar yang tidak dapat menahan aturan pemeriksaan jenis yang lebih ketat, dan saya ingin menggunakannya dalam basis kode baru yang _does_ mengaktifkan pemeriksaan ketat, dan saya tidak dapat mengompilasi kode lama ke perpustakaan karena memiliki jutaan kasus di mana ia tidak mengimpor semua tipe yang diperlukan untuk memberi nama tipe untuk ekspornya (# 9944). Jadi saya ingin menambahkan basis kode lama ke basis kode baru, tetapi dikompilasi sesuai dengan aturan yang lebih longgar. Ini bukan 2 langkah kompilasi yang berbeda; hanya ketika kompilator bekerja pada file sumber di bawah direktori tertentu, ia harus menggunakan aturan laxer.

Bagi saya kasus penggunaan memiliki bagian dari repo yang dijalankan menggunakan node dan perlu dikompilasi ke modul commonjs, sementara bagian lain perlu dikompilasi ke modul ES6 untuk mengaktifkan treeshaking di ES6. Pengalamannya tidak bagus, ada banyak peretasan dengan variabel lingkungan TS_NODE_PROJECT , dalam kasus saya. Sepertinya sesuatu yang bisa membingungkan orang berikutnya yang mempertahankannya ketika saya akhirnya mengubah proyek.

Saya masih ingin melihat ini diselesaikan. Ini akan menjadi kemenangan besar untuk proyek besar yang membutuhkan file tsconfig.json per modul dalam sebuah proyek.

@Robinfr Apa yang tidak extends ?

Benar. Saya mengetahui tentang itu setelah posting ini. Namun satu hal yang perlu diperhatikan adalah bahwa ini tidak berfungsi tanpa menyetel include ke file yang biasanya tidak perlu dilakukan k karena melewati webpack.

Op 15 sep. 2017 9:24 schreef Kitson Kelly [email protected] :

@Robinfr https://github.com/robinfr apa yang tidak diselesaikan oleh fitur extends https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#configuration-inheritance-with-extends ?

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub https://github.com/Microsoft/TypeScript/issues/3645#issuecomment-329703706 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/AD90FLZKcHMJeFU0osJroT_yawlC1oFJks5siiZFga .

@kitsonk extending berfungsi dengan baik, meskipun jika saya tidak melakukan kesalahan, saya harus mengulangi pengaturan tertentu (tidak termasuk folder build dan node_modules saya) di kedua konfigurasi. bagi saya masalah terbesar adalah memastikan semua perkakas saya tahu file konfigurasi mana yang benar juga digunakan (biasanya dengan cara seperti variabel lingkungan TS_NODE_PROJECT . Yang lainnya adalah saat membuka proyek dengan dua tsconfig di VS.code. Tidak ada cara (yang saya tahu) untuk memberi tahu VS file proyek mana yang akan digunakan dan itu berarti untuk beberapa kesalahan file tidak akan digarisbawahi dengan benar, karena pengaturan yang berbeda untuk file-file itu di tsconfig yang sesuai (katakanlah, sesuatu seperti tsconfig.build.json).

@voy bolehkah saya bertanya mengapa Anda memiliki tsconfig yang berbeda untuk membangun? Sejauh yang saya mengerti, VSCode menggunakan file tsconfig terdekat ( tsconfig.json ) ke file yang Anda edit. Satu-satunya masalah yang saya alami sejauh ini adalah Anda perlu memiliki file tsconfig di root sebelum VSCode mulai menggunakan konfigurasi sama sekali ...

@Robin yakin. dalam repositori yang sama saya memiliki file yang diproses menggunakan webpack & babel dan menggunakan modul ES6 untuk mengaktifkan pengocokan pohon. file lain adalah bagian dari proses build dan dieksekusi menggunakan node, itulah sebabnya impor perlu ditranspilasi ke require. tidak yakin bagaimana saya bisa mengatasinya.

@voy bukankah Anda hanya memiliki file-file itu di folder terpisah? Misalnya 1 folder untuk semua file Babel & webpack, dan 1 untuk file node. Kemudian Anda dapat memiliki tsconfig.json untuk masing-masing folder tersebut. Bukankah itu berhasil untukmu?

@Robinfr itu ideal, tapi saya pikir itu tidak selalu mungkin di dunia nyata. misalnya, kami ingin semua file konfigurasi kami menjadi skrip jenis, dikompilasi dan diberi lint sesuai dengan aturan yang sama seperti semua basis kode TypeScript dan beberapa file harus berada di root proyek. Anda dapat melakukan symlink, tetapi terkadang hal itu menimbulkan masalah lain. itulah mengapa saya merasa sesuatu yang lebih fleksibel akan bermanfaat.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

siddjain picture siddjain  Β·  3Komentar

dlaberge picture dlaberge  Β·  3Komentar

remojansen picture remojansen  Β·  3Komentar

kyasbal-1994 picture kyasbal-1994  Β·  3Komentar

blendsdk picture blendsdk  Β·  3Komentar