microsoft / microsoft/TypeScript

[Bug] Projects have different output directory structure with same configuration.

オープン
#40,400 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Needs Investigation
主要言語
Go
スター
111k
フォーク
14.3k
平均マージ
2日 4時間
マージ済み PR(30日)
132

説明

TypeScript Version: 4.0 (npm)

Search Terms:
declarationDir, rootDir, baseURL.

Problem
My app has a circular reference between the client and the server for typing reasons, essentially during prototyping there is a proxy that allows the server and the client to call functions on the remote as though they were local asynchronous functions. This has traditionally worked fine (well, with effort) but lately my server tsconfig seems to want to output files in a different directory structure than it was previously, without warning (I didn't change the tsconfig file). Here's what's happening:

Expected behavior:
The folder structure should look like this:

Project:
    Client/
        tsconfig.json <--"Client tsconfig"
        code.ts
        code.js
    ClientDeclarations/
        code.d.ts
    Common/
        code.ts
        code.d.ts
        code.js
    Server/
        tsconfig.json <-- "Server tsconfig"
        code.ts
        code.js
    ServerDeclarations/
        code.d.ts <-- ! Note server files are meant to be at the root of the output dir
    tsconfig.json <-- "Parent tsconfig"

Actual behavior:
Instead it looks like this:

Project:
    Client/
        tsconfig.json <--"Client tsconfig"
        code.ts
        code.js
    ClientDeclarations/
        code.d.ts
    Common/
        code.ts
        code.d.ts
        code.js
    Server/
        tsconfig.json <-- "Server tsconfig"
        code.ts
        code.js
    ServerDeclarations/
        Client/
             code.d.ts <-- ! This is the client's .d.ts files which shouldn't be output by the server tsproj!
        Server/
             code.d.ts
    tsconfig.json <-- "Parent tsconfig"

Code
This is the "Parent tsconfig" (note I am using ttypescript):

{
  "compileOnSave": false,
  "compilerOptions": {
    "target": "es6",
    "sourceMap": true,
    "strict": true,
    "plugins": [
      { "transform": "../Typescript/SuperTransform.js" },
      { "transform": "../Typescript/Macros.js" }
    ]
  },
  "exclude": [
    "node_modules"
  ]
}

This is the client config (I don't think the references section is used on the client, it's just there to keep the client and server configs similar):

{
  "compileOnSave": false,
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "module": "amd",
    "target": "es6",
    "lib": [ "es6", "dom" ],
    "sourceMap": true,
    "strict": true,
    "build": true,
    "declaration": true,
    "declarationDir": "../ClientDeclarations",
    "baseUrl": "./",
    "paths": {
      "@Common/*": [ "../Common/*" ],
      "@Server/*": [ "../ServerDeclarations/*" ],
      "@Client/*": [ "./*" ]
    }
  },
  "include": [
    "./*",
    "./External/koco.ts",
    "./External/kocss.ts",
    "./External/kopath.ts"
  ],
  "exclude": [
    "node_modules"
  ],
  "references": [
    { "path": "../Common" }
  ]
}

This is the server config (on the server I'm using module-alias):

{
  "compileOnSave": false,
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "lib": [ "es6", "dom" ],
    "sourceMap": true,
    "strict": true,
    "build": true,
    "declaration": true,
    "declarationDir": "../ServerDeclarations",
    "baseUrl": "./",
    "paths": {
      "@Common/*": [ "../Common/*" ],
      "@Client/*": [ "../ClientDeclarations/*" ],
      "@Server/*": [ "./*" ]
    }
  },
  "include": [
    "./*"
  ],
  "exclude": [
    "node_modules",
  ],
  "references": [
    { "path": "../Common" }
  ]
}

Note that the only difference between the client and the server is that they have a different module output type and the client includes a few more files.

I've tried adding "../Client" and "../Client/**" to the list of excludes on the server tsconfig but that didn't do anything. I also tried adding rootDir to be the same as baseUrl but that also didn't do anything. Interestingly removing baseUrl and adding rootDir had the desired effect (although is not usable because I need to use paths).

Playground link
This issue cannot be reproduced on the playground.

Related Issues:
I could not find any related issues.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

issue にある parent、client、server の tsconfig.json の例から始め、declarationDir、baseUrl、rootDir、paths、project references に焦点を当てます。TypeScript 4.0 の出力ディレクトリ構成を再現し、期待される構成と比較します。完了条件は、server が Client の declaration を出力してファイルをネストする理由を説明または修正し、報告された設定をカバーすることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
compilers
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。