microsoft / microsoft/TypeScript
`tsBuildInfoFile` is not extendable. Add an alternative `tsBuildInfoDir` option
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 2日 4時間
- マージ済み PR(30日)
- 132
説明
🔍 Search Terms
tsBuildInfoFile tsbuildinfo output directory
✅ Viability Checklist
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ Suggestion
Add a tsBuildInfoDir config option for specifying the output directory for the .tsbuildinfo file.
📃 Motivating Example
tsconfig/
├── tsconfig.base.json
├── tsconfig.client.json
├── tsconfig.config.json
└── tsconfig.server.json
tsconfig.json
With a project structure like this, there is no way to have the individual project configs (tsconfig.client.ts etc.) derive their tsBuildInfoFile setting from the base config (tsconfig.base.json). If we set tsBuildInfoFile to some custom value in the base config, the individual project configs all end up having the same output path for their .tsbuildinfo files, which is of course wrong, so we have no better option than to set tsBuildInfoFile for each of the projects individually.
The recently introduced ${configDir} template variable can't help us here since the config files are all located in the same folder. Even if they weren't, it still wouldn't give us enough flexibility.
One possible solution is to rely on the outDir option which also affects where .tsbuildinfo files are placed, but it's only fine if we don't mind them being placed beside other output files, or if there are no other output files because we are using noEmit.
What I suggest is adding a tsBuildInfoDir option for specifying the output directory for the .tsbuildinfo file as an alternative to tsBuildInfoFile. The process of determining how the file is placed within that directory should be identical to that of outDir / declarationDir, meaning that the config file's placement relative to rootDir should be replicated.
With the following tsconfig.base.json,
// tsconfig.base.json
{
"compilerOptions": {
"rootDir": "${configDir}",
"outDir": "${configDir}/dist",
"tsBuildInfoDir": "./node_modules/.tsbuildinfo",
"incremental": true
}
}
this would enable structure as complicated as this one:
client/
│── dist/
│ │── index.js
│── index.ts
└── tsconfig.client.json
node_modules/
└── .tsbuildinfo/
├── tsconfig.client.tsbuildinfo
├── tsconfig.config.tsbuildinfo
├── tsconfig.server.tsbuildinfo
└── tsconfig.tsbuildinfo
server/
│── dist/
│ │── index.js
│── index.ts
└── tsconfig.server.json
tsconfig.base.json
tsconfig.config.json
tsconfig.json
vite.config.ts
Here is what I assumed about the other config files:
Click to expand
// client/tsconfig.client.json
{
"include": ["**/*.ts"]
}
// client/tsconfig.server.json
{
"include": ["**/*.ts"]
}
// tsconfig.config.json
{
"compilerOptions": {
"noEmit": true
},
"include": ["*.config.ts"]
}
// tsconfig.json
{
"files": [],
"references": [
{ "path": "./client/tsconfig.client.json" },
{ "path": "./server/tsconfig.server.json" },
{ "path": "./tsconfig.config.json" }
]
}
When both tsBuildInfoDir and tsBuildInfoFile are set, the latter could be interpreted as the desired file name rather than the path (the path is then ${tsBuildInfoDir}/${tsBuildInfoFile}).
💻 Use Cases
- What do you want to use this for?
→ Putting.tsbuildinfofiles undernode_modules/.tsbuildinfoso that they are not in the way, but I still get the advantages of incremental builds. - What shortcomings exist with current approaches?
→ The shortcomings oftsBuildInfoFileandoutDirare described above. - What workarounds are you using in the meantime?
→ SettingtsBuildInfoFilefor each project individually :(
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
ソースファイルやテストは指定されていません。まず、tsBuildInfoFile、outDir、declarationDir がビルド情報のパスをどのように決定するか、また継承された設定がどのように解決されるかを追跡してください。tsBuildInfoDir オプションが提案されたディレクトリ構成をサポートし、既存の動作を維持し、ここで説明されている設定例と相互作用を網羅していれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- build-system, compilers
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 30/100