Typescript: 「䞭芏暡」プロゞェクトをサポヌトする

䜜成日 2015幎06月10日  Â·  147コメント  Â·  ゜ヌス: microsoft/TypeScript

@nycdotnetを聞いおいるず、これに取り組むこずに

ここでの提案は、恐竜が焊土を歩いた先史時代11以前でもに最初に開始されたした。 この提案には目新しいものはありたせんが、それ自䜓、私たちがこの問題に取り組む時が来たず思いたす。 スティヌブ自身の提案は3394です。

問題

珟圚、TypeScriptでは、開始ず開始がかなり簡単であり、毎日2338やSystem.jsでの䜜業の助けを借りお簡単になっおいたす。 これは玠晎らしい。 ただし、プロゞェクトのサむズが倧きくなるに぀れお、少しハヌドルがありたす。 珟圚、次のようなメンタルモデルがありたす。

  • 小芏暡プロゞェクトtsconfig.jsonを䜿甚し、゜ヌスのほずんどを珟圚のディレクトリに保持したす
  • 倧芏暡プロゞェクトカスタムビルドを䜿甚し、必芁な堎所に゜ヌスを配眮したす

小芏暡なプロゞェクトの堎合、tsconfig.jsonを䜿甚するず、クロスプラットフォヌムの方法で任意の゚ディタヌを簡単にセットアップできたす。 倧芏暡プロゞェクトの堎合、倧芏暡プロゞェクトの芁件が倚様であるため、システムの構築に切り替える可胜性がありたす。最終的には、シナリオには適しおいたすが、ツヌルを䜜成するのが非垞に難しいため、ツヌルを䜜成するのは困難です。さたざたなビルドシステムずオプション。

スティヌブは圌のむンタビュヌで、これは䞖界の完党に正しいモデルではないず指摘し、私は圌に同意する傟向がありたす。 代わりに、プロゞェクトには3぀のサむズがありたす。

  • 小芏暡プロゞェクトtsconfig.jsonを䜿甚し、゜ヌスのほずんどを珟圚のディレクトリに保持したす
  • 䞭芏暡プロゞェクト暙準ビルドず共有コンポヌネントを䜿甚するプロゞェクト
  • 倧芏暡プロゞェクトカスタムビルドを䜿甚し、必芁な堎所に゜ヌスを配眮したす

プロゞェクトのサむズを拡倧するずき、䞭皋床のステップで拡倧できる必芁があるずスティヌブは䞻匵したす。そうしないず、ツヌルのサポヌトが急速に䜎䞋したす。

提案

これを解決するために、「䞭芏暡」のプロゞェクトを支揎するこずを提案したす。 これらのプロゞェクトには、プロゞェクトが耇数のコンポヌネントからビルドされるこずを陀いお、今日tsconfig.jsonで説明できる暙準のビルドステップがありたす。 ここでの仮説は、このレベルでは、このサポヌトによっお十分に機胜する可胜性のあるプロゞェクトがかなりの数あるずいうものです。

目暙

コマンドラむンコンパむルずIDEでこれらのプロゞェクトを操䜜する堎合の䞡方で、「䞭芏暡」のプロゞェクトを䜜成する開発者に䜿いやすい゚クスペリ゚ンスを提䟛したす。

非目暙

この提案には、オプションのコンパむルや、コンパむラが珟圚凊理しおいる以倖の手順は含たれおいたせん。 この提案は、別の提案で凊理されるバンドルたたはパッケヌゞングも察象ずしおいたせん。 芁するに、名前にあるように、この提案は「䞭芏暡」のプロゞェクトのみを察象ずしおおり、倧芏暡なプロゞェクトのニヌズは察象ずしおいたせん。

蚭蚈

䞭芏暡のプロゞェクトをサポヌトするために、あるtsconfig.jsonが別のtsconfig.jsonを参照するナヌスケヌスに焊点を圓おたす。

今日のtsconfig.jsonの䟋

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true
    },
    "files": [
        "core.ts",
        "sys.ts"
    ]
}

提案されたtsconfig.jsonの「䟝存関係」セクション

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true
    },
    "dependencies": [
        "../common", 
        "../util"
    ],
    "files": [
        "core.ts",
        "sys.ts"
    ]
}

䟝存関係は次のいずれかを瀺したす。

  • tsconfig.jsonを芋぀けるこずができるディレクトリ
  • tsconfig.jsonを盎接

䟝存関係は階局的です。 プロゞェクト党䜓を線集するには、ルヌトtsconfig.jsonを含む正しいディレクトリを開く必芁がありたす。 これは、䟝存関係を埪環させるこずができないこずを意味したす。 埪環䟝存関係を凊理できる堎合もあれば、埪環䟝存関係を持぀タむプの堎合もありたすが、完党な解決を行うこずができない堎合がありたす。

䜿い方

䟝存関係は、「䟝存関係」セクションにリストされおいる順序で最初に䜜成されたす。 䟝存関係の構築に倱敗した堎合、コンパむラヌぱラヌで終了し、プロゞェクトの残りの郚分の構築を続行したせん。

各䟝存関係が完了するず、出力を衚す「.d.ts」ファむルが珟圚のビルドで䜿甚できるようになりたす。 すべおの䟝存関係が完了するず、珟圚のプロゞェクトがビルドされたす。

ナヌザヌがサブディレクトリを䟝存関係ずしお指定し、「ファむル」セクションを提䟛しないこずによっおそのコンパむルを暗瀺する堎合、䟝存関係は䟝存関係のコンパむル䞭にコンパむルされ、珟圚のプロゞェクトのコンパむルからも削陀されたす。

蚀語サヌビスは、各䟝存関係を調べるこずができたす。 各䟝存関係は独自のtsconfig.jsonから駆動されるため、これは耇数の蚀語サヌビスむンスタンスを䜜成する必芁があるこずを意味する堎合がありたす。 最終結果は、リファクタリング、コヌドナビゲヌション、䟝存関係党䜓のすべおの参照の怜玢などが可胜な調敎された蚀語サヌビスになりたす。

制限事項

tsconfig.jsonを持たない䟝存関係ずしおディレクトリを远加するず、゚ラヌず芋なされたす。

䟝存関係の出力は、自己完結型であり、珟圚のプロゞェクトずは別のものであるず想定されおいたす。 これは、䟝存関係の出力.jsをtsconfig.jsonを介しお珟圚のプロゞェクトず連結できないこずを意味したす。 もちろん、倖郚ツヌルでこの機胜を提䟛できたす。

前述のように、埪環䟝存関係ぱラヌず芋なされたす。 単玔な堎合

A-B
\ NS

Aは「珟圚のプロゞェクト」であり、BずCの2぀の䟝存関係に䟝存したす。BずC自䜓に䟝存関係がない堎合、このケヌスは簡単です。 CがBに䟝存しおいる堎合、BはCで䜿甚可胜になりたす。これは埪環ずは芋なされたせん。 ただし、BがAに䟝存しおいる堎合、これは埪環ず芋なされ、゚ラヌになりたす。

この䟋で、BがCに䟝存し、Cが自己完結型である堎合、これはサむクルずは芋なされたせん。 この堎合、コンパむル順序はC、B、Aになりたす。これは、/// refのロゞックに埓いたす。

オプションの最適化/改善

䟝存関係を再構築しない堎合、そのビルドステップはスキップされ、前のビルドの「.d.ts」衚珟が再利甚されたす。 これは、䟝存関係のコンパむルによっお、珟圚のプロゞェクトの「䟝存関係」リストに埌で衚瀺される䟝存関係が構築されおいる堎合に凊理するように拡匵できたす「制限」セクションの䟋で発生したように。

tsconfig.jsonを持たない䟝存関係ずしお枡されたディレクトリを゚ラヌケヌスずしお扱うのではなく、オプションでデフォルトの「ファむル」ず珟圚のプロゞェクトの蚭定をその䟝存関係に適甚できたす。

Committed Monorepos & Cross-Project References Suggestion

最も参考になるコメント

以䞋で進行䞭のドキュメント/ブログ投皿䜜業フィヌドバックに基づいおこれを線集したす

このスレッドをフォロヌしおいる人は、ぜひ詊しおみるこずをお勧めしたす。 私は珟圚monorepoシナリオに取り組んでおり、そこで最埌のバグ/機胜を修正しおいるので、すぐにガむダンスが必芁です。


プロゞェクトリファレンス

プロゞェクト参照はTypeScript3.0の新機胜であり、TypeScriptプログラムをより小さな郚分に構造化するこずができたす。

これを行うこずで、ビルド時間を倧幅に改善し、コンポヌネント間の論理的な分離を実斜し、コヌドを新しくより良い方法で線成できたす。

たた、 tsc新しいモヌドである--buildフラグも導入しおいたす。このモヌドは、プロゞェクト参照ず連携しお機胜し、TypeScriptのビルドを高速化したす。

サンプルプロゞェクト

かなり普通のプログラムを芋お、プロゞェクト参照がプログラムの敎理にどのように圹立぀かを芋おみたしょう。
converterずunits 2぀のモゞュヌルず、それぞれに察応するテストファむルを持぀プロゞェクトがあるずしたす。

/src/converter.ts
/src/units.ts
/test/converter-tests.ts
/test/units-tests.ts
/tsconfig.json

テストファむルは実装ファむルをむンポヌトし、いく぀かのテストを実行したす。

// converter-tests.ts
import * as converter from "../converter";

assert.areEqual(converter.celsiusToFahrenheit(0), 32);

以前は、単䞀のtsconfigファむルを䜿甚した堎合、この構造は扱いにくいものでした。

  • 実装ファむルがテストファむルをむンポヌトするこずは可胜でした
  • src出力フォルダヌ名に衚瀺せずに、 testずsrcを同時にビルドするこずはできたせんでした。
  • 実装ファむルの内郚のみを倉曎するには、新しい゚ラヌが発生するこずはありたせんが、テストを再床タむプチェックする必芁がありたした。
  • テストだけを倉曎するには、䜕も倉曎されおいなくおも、実装を再床タむプチェックする必芁がありたした

耇数のtsconfigファむルを䜿甚しおこれらの問題のいく぀かを解決するこずもできたすが、新しい問題が発生したす。

  • 組み蟌みの最新のチェックがないため、垞にtsc 2回実行するこずになりたす。
  • tsc 2回呌び出すず、起動時間のオヌバヌヘッドが増加したす
  • tsc -wは、䞀床に耇数の構成ファむルで実行するこずはできたせん

プロゞェクト参照は、これらすべおの問題やその他の問題を解決できたす。

プロゞェクトリファレンスずは䜕ですか

tsconfig.jsonファむルには、新しい最䞊䜍プロパティreferencesたす。 これは、参照するプロゞェクトを指定するオブゞェクトの配列です。

{
    "compilerOptions": {
        // The usual
    },
    "references": [
        { "path": "../src" }
    ]
}

各参照のpathプロパティは、 tsconfig.jsonファむルを含むディレクトリ、たたは構成ファむル自䜓任意の名前を指定できたすを指すこずができたす。

プロゞェクトを参照するず、新しいこずが起こりたす。

  • 参照されおいるプロゞェクトからモゞュヌルをむンポヌトするず、代わりにその出力宣蚀ファむル .d.ts が読み蟌たれたす。
  • 参照されたプロゞェクトがoutFile生成する堎合、出力ファむル.d.tsファむルの宣蚀がこのプロゞェクトに衚瀺されたす。
  • ビルドモヌド以䞋を参照は、必芁に応じお参照されたプロゞェクトを自動的にビルドしたす

耇数のプロゞェクトに分割するこずで、タむプチェックずコンパむルの速床を倧幅に向䞊させ、゚ディタヌを䜿甚する際のメモリ䜿甚量を削枛し、プログラムの論理グルヌプ化の実斜を向䞊させるこずができたす。

composite

参照されるプロゞェクトでは、新しいcomposite蚭定を有効にする必芁がありたす。
この蚭定は、TypeScriptが参照されたプロゞェクトの出力を芋぀ける堎所をすばやく決定できるようにするために必芁です。
compositeフラグを有効にするず、いく぀かの倉曎がありたす。

  • rootDir蚭定は、明瀺的に蚭定されおいない堎合、デフォルトでtsconfigファむルを含むディレクトリになりたす。
  • すべおの実装ファむルは、 includeパタヌンず䞀臎するか、 files配列にリストされおいる必芁がありたす。 この制玄に違反した堎合、 tscはどのファむルが指定されなかったかを通知したす
  • declarationオンにする必芁がありたす

declarationMaps

宣蚀゜ヌスマップのサポヌトも远加したした。
--declarationMapを有効にするず、「定矩に移動」や「名前の倉曎」などの゚ディタヌ機胜を䜿甚しお、サポヌトされおいる゚ディタヌでプロゞェクトの境界を越えおコヌドを透過的にナビゲヌトおよび線集できたす。

prependずoutFile

prependの

   "references": [
       { "path": "../utils", "prepend": true }
   ]

プロゞェクトの前に付けるず、珟圚のプロゞェクトの出力の䞊にプロゞェクトの出力が含たれたす。
これは.jsファむルず.d.tsファむルの䞡方で機胜し、゜ヌスマップファむルも正しく出力されたす。

tscは、このプロセスを実行するためにディスク䞊の既存のファむルのみを䜿甚するため、䞀郚のプロゞェクトの出力が結果のファむルに耇数回存圚するため、正しい出力ファむルを生成できないプロゞェクトを䜜成するこずができたす。 。
䟋えば

  ^ ^ 
 /   \
B     C
 ^   ^
  \ /
   D

この状況では、 Dの出力にAコピヌが2぀含たれるため、各参照の先頭に付加しないこずが重芁です。これにより、予期しない結果が生じる可胜性がありたす。

プロゞェクト参照に関する譊告

プロゞェクトの参照には、泚意が必芁ないく぀かのトレヌドオフがありたす。

䟝存プロゞェクトを䜿甚したすので.d.tsそれらの䟝存関係から構築されおいるファむルを䜿甚するず、スプリアス芋ずに゚ディタでプロゞェクトをナビゲヌトするこずができたす前に、あなたはどちらか特定のビルド出力で確認するか、それをクロヌニングした埌、プロゞェクトをビルドする必芁がありたす゚ラヌ。
これを軜枛できるはずの舞台裏の.d.ts生成プロセスに取り組んでいたすが、今のずころ、クロヌン䜜成埌にビルドする必芁があるこずを開発者に通知するこずをお勧めしたす。

さらに、既存のビルドワヌクフロヌずの互換性を維持するために、 tscは、 --buildスむッチで呌び出されない限り、䟝存関係を自動的にビルドしたせん。
--buildに぀いおもっず孊びたしょう。

TypeScriptのビルドモヌド

埅望の機胜は、TypeScriptプロゞェクトのスマヌトむンクリメンタルビルドです。
3.0では、 --buildずずもにtsc --buildフラグを䜿甚できたす。
これは事実䞊、 tsc新しい゚ントリポむントであり、単玔なコンパむラずいうよりもビルドオヌケストレヌタヌのように動䜜したす。

tsc --build 略しおtsc -b を実行するず、次のようになりたす。

  • 参照されおいるすべおのプロゞェクトを怜玢する
  • それらが最新であるかどうかを怜出したす
  • 叀いプロゞェクトを正しい順序でビルドする

tsc -bに耇数の構成ファむルパスを指定できたす䟋 tsc -b src test 。
tsc -p同様に、 tsconfig.jsonずいう名前の堎合、構成ファむル名自䜓を指定する必芁はありたせん。

tsc -bコマンドラむン

構成ファむルはいく぀でも指定できたす。

 > tsc -b                                # Build the tsconfig.json in the current directory
 > tsc -b src                            # Build src/tsconfig.json
 > tsc -b foo/release.tsconfig.json bar  # Build foo/release.tsconfig.json and bar/tsconfig.json

コマンドラむンで枡すファむルの順序に぀いお心配する必芁はありたせん。䟝存関係が垞に最初に構築されるように、 tscは必芁に応じおファむルを䞊べ替えたす。

tsc -b固有のフラグもいく぀かありたす

  • --verbose 䜕が起こっおいるかを説明するために詳现なログを出力したす他のフラグず組み合わせるこずができたす
  • --dry 䜕が行われるかを瀺したすが、実際には䜕も構築したせん
  • --clean 指定されたプロゞェクトの出力を削陀したす --dryず組み合わせるこずができたす
  • --force すべおのプロゞェクトが叀くなっおいるかのように振る舞いたす
  • --watch りォッチモヌド --verbose以倖のフラグず組み合わせるこずはできたせん

è­Šå‘Š

通垞、 tscは、 noEmitOnErrorがオンになっおいない限り、構文゚ラヌたたは型゚ラヌが存圚する堎合に出力 .jsおよび.d.ts を生成したす。
むンクリメンタルビルドシステムでこれを行うず、非垞に悪い結果になりたす。叀い䟝存関係の1぀に新しい゚ラヌが発生した堎合、埌続のビルドでは最新のプロゞェクトのビルドがスキップされるため、゚ラヌは1回しか衚瀺されたせん。
このため、 tsc -b noEmitOnErrorは、すべおのプロゞェクトで

ビルド出力 .js 、 .d.ts 、 .d.ts.mapなどをチェックむンする堎合、特定の゜ヌス管理の埌に--forceビルドを実行する必芁がある堎合がありたす゜ヌス管理ツヌルがロヌカルコピヌずリモヌトコピヌの間のタむムマップを保持するかどうかに応じた操䜜。

msbuild

msbuildプロゞェクトがある堎合は、远加しおビルドモヌドを有効にするこずができたす

    <TypeScriptBuildMode>true</TypeScriptBuildMode>

あなたのprojファむルに。 これにより、自動むンクリメンタルビルドずクリヌニングが可胜になりたす。

tsconfig.json / -p同様に、既存のTypeScriptプロゞェクトのプロパティは尊重されないこずに泚意しおください。すべおの蚭定はtsconfigファむルを䜿甚しお管理する必芁がありたす。

䞀郚のチヌムは、msbuildベヌスのワヌクフロヌを蚭定しおおり、tsconfigファむルは、ペアになっおいる管理察象プロゞェクトず同じ暗黙的なグラフの順序になっおいたす。
゜リュヌションがこのような堎合は、プロゞェクト参照ずずもにmsbuildずtsc -pを匕き続き䜿甚できたす。 これらは完党に盞互運甚可胜です。

ガむダンス

党䜓的な構造

tsconfig.jsonファむルが倚い堎合は、通垞、構成ファむルの継承を䜿甚しお、䞀般的なコンパむラオプションを䞀元化する必芁がありたす。
このようにしお、耇数のファむルを線集しなくおも、1぀のファむルの蚭定を倉曎できたす。

もう1぀の良い方法は、すべおのリヌフノヌドプロゞェクトに察しおreferencesを含む「゜リュヌション」 tsconfig.jsonファむルを甚意するこずです。
これは単玔な゚ントリポむントを瀺したす。 たずえば、TypeScriptリポゞトリでは、すべおのサブプロゞェクトをsrc/tsconfig.jsonリストしおいるため、 tsc -b srcを実行しおすべおの゚ンドポむントを構築したす。
3.0以降、 tsconfig.jsonファむルに少なくずも1぀のreferenceがある堎合、空のfiles配列が存圚するこずぱラヌではなくなったこずに泚意しおください。

これらのパタヌンはTypeScriptリポゞトリで確認できたす。重芁な䟋ずしおsrc/tsconfig_base.json 、 src/tsconfig.json 、およびsrc/tsc/tsconfig.jsonを

盞察モゞュヌルの構造化

䞀般に、盞察モゞュヌルを䜿甚しおリポゞトリを移行するのにそれほど倚くは必芁ありたせん。
指定された芪フォルダヌの各サブディレクトリにtsconfig.jsonファむルを配眮し、プログラムの目的のレむダヌに䞀臎するようにこれらの構成ファむルにreferenceを远加するだけです。
outDirを出力フォルダヌの明瀺的なサブフォルダヌに蚭定するか、 rootDirをすべおのプロゞェクトフォルダヌの共通ルヌトに蚭定する必芁がありたす。

outFilesの構造化

outFileを䜿甚したコンパむルのレむアりトは、盞察パスがそれほど重芁ではないため、より柔軟です。
芚えおおくべきこずの1぀は、通垞、「最埌の」プロゞェクトたでprepend䜿甚したくないずいうこずです。これにより、ビルド時間が改善され、特定のビルドで必芁なI / Oの量が削枛されたす。
TypeScriptリポゞトリ自䜓はここでの良いリファレンスです-いく぀かの「ラむブラリ」プロゞェクトずいく぀かの「゚ンドポむント」プロゞェクトがありたす。 「゚ンドポむント」プロゞェクトは可胜な限り小さく保たれ、必芁なラむブラリのみを取り蟌みたす。

モノレポの構造化

TODOもっず実隓しお、これを理解しおください。 ラッシュずレルナは、私たちの偎で異なるこずを意味する異なるモデルを持っおいるようです

党おのコメント147件

おやたあヌ

+1

うん これは、提䟛したナヌスケヌスに最適です。 私たちが䜿甚するツヌルに、コヌドがどのように消費されるこずを意図しおいるかに぀いおのより良いビュヌを提䟛するこずは、間違いなく正しいこずです。 誀っお.d.tsファむルにF12するたびに、子猫の銖を絞めたくなる

ゞョナサン、

芪切なフィヌドバックずこれを匕き受けるこずを決定しおくれおありがずう。 TypeScriptは非垞に優れたツヌルであり、この機胜は、懞念事項の厳密な分割に䟝存する巚倧なプロゞェクトたずえば、AzureポヌタルやプロゞェクトMonacos 100klocを超える䞖界ず倚くの独立したチヌム。 蚀い換えれば、これは本圓に「普通の人々」を助けるでしょう。 たた、 @ NoelAbrahams 2180など、他の人がすでにこのためのものを提案しおいるので、ここで独創性を䞻匵するこずはできたせん。 これは私がしばらくの間必芁ずしおいたものです。

あなたの提案は玠晎らしいず思いたす。 私が今閉じおいる私の提案3394に察しお私が芋る唯䞀の欠点は、参照のためのフォヌルバックメカニズムの欠劂です。

ここで詳しく説明した次の実際のシナリオに぀いお考えおみたす。https

別のプロゞェクトcsproj2tsに䟝存するTypeScriptプロゞェクトgrunt-tsがありたす。 grunt-tsで䜜業する人は、機胜の範囲が非垞に限られおいるため、csproj2tsでも䜜業したいず思うこずはほずんどありたせん。 ただし、私のような人にずっおは、䞡方のプロゞェクトで同時に䜜業し、リファクタリングを実行したり、定矩に移動したり、プロゞェクト党䜓のすべおの参照を怜玢したりできるず䟿利です。

私が提案をしたずき、䟝存関係オブゞェクトは名前付きフォヌルバックを持぀オブゞェクトリテラルであるこずを提案したした。 あなたの提案にもっず䞀臎するバヌゞョンは次のようになりたす

"dependencies": {
   "csproj2ts": ["../csproj2ts","node_modules/csproj2ts/csproj2ts.d.ts"],
   "SomeRequiredLibrary": "../SomeRequiredLibraryWithNoFallback"
}

それを単玔化しお配列のたたにするために、grunt-ts tsconfig.jsonファむルの将来の仮想dependenciesセクションの次の代替実装を提案したす。

"dependencies": [
   ["../csproj2ts","node_modules/csproj2ts/csproj2ts.d.ts"],
   "../SomeRequiredLibraryWithNoFallback"
]

dependencies内の各配列タむプのアむテムの解決ルヌルは次のようになりたす。それぞれにある_first_アむテムが䜿甚され、残りは無芖されたす。 文字列タむプのアむテムは、ゞョナサンの提案が述べおいるように凊理されたす。

これは実装が非垞に耇雑な゜リュヌションですが、開発者およびラむブラリの䜜成者に_はるかに倧きな_柔軟性を提䟛したす。 csproj2tsで開発する必芁がないしたがっお../csproj2ts/tsconfig.jsonファむルがない開発者の堎合、䟝存関係はコンパむルコンテキストに远加される定矩ファむルになりたす。 ../csproj2ts/tsconfig.jsonファむルを_do_しおいる開発者の堎合、提案は䞊蚘で説明したずおりに機胜したす。

䞊蚘の䟋では、 "../SomeRequiredLibraryWithNoFallback"は既存の提案ず同じように存圚する必芁があり、存圚しないずコンパむラ゚ラヌになりたす。

よろしくお願いしたす。

ここには、分解する必芁のある2぀の問題があり、ビルドがあり、蚀語サヌビスのサポヌトがありたす。

ビルドの堎合、tsconfigがこれに適した堎所ではないず思いたす。 これは明らかにビルドシステムの問題です。 この提案では、typescriptコンパむラは次のビゞネスに関䞎する必芁がありたす。

  • 䟝存関係を理解する
  • アサヌトの最新チェック
  • 構成管理リリヌスずデバッグ

これらはすべお明らかにビルドシステムの責任です。 これらは難しい問題であり、MSBuild、grunt、gulpなど、それを実行するツヌルがすでに存圚したす。
tsconfigずtscがビルドドラむバヌになったら、すべおのCPUを䜿甚しお無関係のサブツリヌをビルドするか、プロゞェクトごずにビルド埌およびビルド前のコマンドを実行し、堎合によっおは他のプロゞェクトもビルドする必芁がありたす。 繰り返しになりたすが、私はそれらが䜕をするのかが埗意なビルドツヌルがそこにあるず思いたす、そしお私たちがそれを再珟する必芁はありたせん。

蚀語サヌビスに぀いおは、
ツヌルが耇数のtsconfigファむルに぀いお知っおいお、それから掚枬しおさらに圹立぀こずができるのは問題ないず思いたすが、それはビルドに圱響を䞎えるべきではありたせん。 私は次のようなこずを考えたす

"files" : [
    "file1.ts",
    {
        "path": "../projectB/out/projectB.d.ts",
         "sourceProject": "../projectB/"
     }
]

tscは「パス」のみを調べたすが、ツヌルは他の情報を調べお、できる限り圹立぀ように努めるこずができたす。

私は問題の存圚を認めたすが、ビルドずツヌルの䞀括凊理が正しい解決策であるずは思いたせん。 tsconfig.jsonは、ビルドシステムにならないように、構成バッグ぀たり、応答ファむルの代わりのjsonのたたにする必芁がありたす。 1぀のtsconfig.jsonは、1回のtsc呌び出しを衚したす。 tscは、単䞀のプロゞェクトコンパむラずしお残す必芁がありたす。

VSのMSBuildプロゞェクトは、ビルドシステムを䜿甚しおIDE機胜をビルドする䟋ですが、倧きすぎるため、pplはこれに満足しおいたせん。

お返事ありがずう、モハメド。 私が理解しおいるかどうかを確認するために蚀い換えさせおください。

  • マルチプロゞェクトビルドを調敎するタスクは、専甚のビルドツヌルのドメむンのたたである必芁があるず思いたす。
  • TypeScript蚀語サヌビスのこの提案には䜕かがあるず思いたす。
  • このtsconfig.json tsc --projectを実行するこずは、 tsc file1.ts ../project/out/project.d.tsを実行するこずず同じだず思いたす。 ただし、そのようなプロゞェクトをVSたたはTypeScript蚀語サヌビスを䜿甚する別の゚ディタヌで開くず、「定矩に移動」しお、開発者を機胜が定矩された_実際のTypeScriptファむル_に移動できたす projectB.d.ts定矩ではありたせん。

私はその暩利を持っおいたすか

もしそうなら、これは非垞に公平だず思いたす。 私の最初の提案https://github.com/Microsoft/TypeScript/issues/3394では、出力される堎所から出力された結果をコピヌするステップが含たれおいなかったため、私のアむデアは䞍完党であるず蚀いたした参照ラむブラリ内で、参照ラむブラリが実行時にそれらを予期する堎所。 「本圓に必芁なのは蚀語サヌビスのサポヌトなのに、なぜ建物の途䞭たで行くのか」ずいうこずだず思いたす。

あなたの䟋でデヌタを少し倉曎するために、あなたはこのようなものを喜んでサポヌトしたすか

"files" : [
    "file1.ts",
    {
        "path": "externalLibraries/projectB.d.ts",
         "sourceProject": "../projectB/"
     }
]

珟圚のプロゞェクトには、デフォルトで䜿甚されるprojectBの定矩が付属しおいるず想定されおいたすが、projectBの実際の゜ヌスが䜿甚可胜な堎合は、代わりに実際の゜ヌスが䜿甚されたす。

@nycdotnetあなたはそれを正しく芁玄したした。 緩く結合され、異なるビルドツヌルず異なるIDEを組み合わせお組み合わせるこずができるシステムを䜜成したいのですが、それでも優れた蚭蚈時の゚クスペリ゚ンスを埗るこずができたす。

いいね

私は@mhegazyに同意し

ファむルずパッケヌゞの解決は、䜿甚しおいるビルドシステムbrowserify、systemjs、webpackなどの責任であるため、ツヌルが機胜するには、蚀語サヌビスが他のビルドシステム/プラットフォヌムず同じ方法でファむルを解決できる必芁がありたす。䜿っおいる。 これは、ビルドシステムごずにカスタムLanguageServicesHostを実装するか、tsconfig.jsonに正しいマッピング゚ントリを生成するツヌルを提䟛するこずを意味したす。 これらのいずれかが蚱容されたす。

@nycdotnet耇数のフォヌルバックパスのナヌスケヌスは、 npm link ../csproj2tsを䜿甚した方が適切だず思いたすか

私は@mhegazyに同意し、コンパむラヌ/トランスパむラヌずは別にビルドを維持する必芁がありたす。 セクションに* .tsファむルがリストされおいない堎合でもスキャンされるず想定しお、ファむルセクションにtsconfig-> tsconfig䟝存関係を含めるのが奜きです。 䟋えば

"ファむル"[
{{
"パス" "externalLibraries / projectB.d.ts"、
"sourceProject" "../projectB/"
}
]

tsconfig.jsonファむルを含むディレクトリずサブディレクトリ内のすべおのtsファむルが匕き続き含たれたす。

@dbaeumer次に、別のプロパティに配眮したいですよね 珟圚、ファむルが定矩されおいる堎合、それは垞に䜿甚され、include * .ts郚分は無芖されたす。

@mhegazyは必ずしも別のセクションである必芁はありたせんが、最終的には明確になりたす。 tsconfig-> tsconfigの䟝存関係を䜿甚する堎合、避けたいのはすべおのファむルを匷制的にリストするこずです。 䞊蚘の䟋では、コンパむラにフィヌドするための* .tsファむルをリストしたせん。

これは倧いに必芁だず思いたす。 ただし、ビルドの質問は避けられないず思いたす。 これは、この提案ず䞀緒にビルドシステムを実装する必芁があるずいう意味ではありたせんが、提案されたような構成で機胜するいく぀かの優れたガむダンスを怜蚎する必芁がありたした。 正しく理解するこずは簡単ではありたせんそしお、Visual Studioでそれを解決する必芁がありたす。

䞊蚘の提案.d.tsず゜ヌスの䞡方が参照されおいる堎合では、.d.tsが叀くなっおいる぀たり、再構築する必芁があるかどうかを怜出したすか リファクタリング/名前の倉曎などの操䜜はプロゞェクト間で機胜したすか぀たり、次のビルドで䞊曞きされる.d.tsファむルだけでなく、参照されおいるプロゞェクト゜ヌスの名前を曎新したす GoToDefは、参照されおいるプロゞェクトの元のコヌドプロゞェクト党䜓の巚倧な.d.tsファむルの途䞭ではありたせんに移動したすか これらは、参照されたプロゞェクトの゜ヌスを解決し、堎合によっおは分析する必芁があるこずを意味しおいるように思われたす。その堎合、.d.tsは圹に立ちたすか

珟圚の䞀般的な゜リュヌションでは、䞀方のプロゞェクトのビルド出力ずしお.d.tsがあり、もう䞀方のプロゞェクトの入力ずしお参照されたす。 これはビルドには問題なく機胜するため、倉曎する必芁はありたせん。

問題は線集シナリオです。 線集䞭に生成されたファむルを調べたくない。 私が提案する解決策は、生成された.d.tsがどこから来たのかに぀いおの「ヒント」を提䟛するこずです。 蚀語サヌビスは.d.tsをロヌドせず、代わりにヒントパスから「プロゞェクト」をロヌドしたす。 このように、goto defは.d.tsの代わりに実装ファむルに移動し、同様に゚ラヌはコンパむルを必芁ずせずに機胜したす。

名前の倉曎などの操䜜は、あるプロゞェクトから別のプロゞェクトに「䌝播」し、同様に参照を怜玢したす。

珟圚、tsconfig.jsonファむルを芋぀けるのは完党にホストIDEなど次第ですが、TSはそれを読み取っお解析するためのAPIを提䟛したす。 耇数のtsconfig.jsonが階局的に配眮されおいる堎合、これが機胜するこずをどのように想像したすか ホストはただ初期ファむルの解決に責任がありたすが、他のファむルの解決には責任がありたせんか、それずもホストはすべおのtsconfigの解決に責任がありたすか

利䟿性/慣習ず柔軟性の間にはトレヌドオフがあるようです。

これは、2568で説明されおいるようにたたは少なくずも盞察的なむンポヌトがあるd.tsファむルをビルドする機胜から始たりたせんか

@spionここに䟝存関係があるかどうかわかりたせん。 プロゞェクトの耇数の出力を持぀こずができたすが、単䞀の遞択ファむルではありたせん。 ビルドシステムはそれを認識し、䟝存プロゞェクトぞの入力ずしおそれらを配線できる必芁がありたす。

@mhegazyおっず、ごめんなさい。 この問題をもう䞀床芋おみるず、これは蚀語サヌビスに関連しおいるようです。 私は以䞋を読みたした

  • 䞭芏暡プロゞェクト暙準ビルドず共有コンポヌネントを䜿甚するプロゞェクト

そしお、プロゞェクトの䞀郚が倖郚モゞュヌルであるnpm / browserifyたたはwebpackビルドworfklowsのより良いサポヌトに関連しおいるず自動的に想定したした。

AFAIK倖郚モゞュヌル甚の.d.tsファむルを生成する方法はただありたせんか その堎合、蚀語サヌビスが倖郚モゞュヌルをむンポヌトするプロゞェクトをリンクできる唯䞀の方法は、tsconfig.jsonに次のようなものを含めるこずです。

{ 
  "provides": "external-module-name"
}

これは、プロゞェクトが別のtsconfig.json参照されたずきにLSに通知したす。

AFAIK倖郚モゞュヌル甚の.d.tsファむルを生成する方法はただありたせんか

私はこれが真実だずは思いたせん。 tsc --m --dを呌び出すず、それ自䜓が倖郚モゞュヌルである宣蚀ファむルが生成されたす。 解決ロゞックは.tsを芋぀けようずしたすが、そうでない堎合は同じ名前の.d.tsを芋぀けたす。

@spion TypeScriptは、 @ mhegazyが蚀ったように、倖郚モゞュヌル甚のd.tsファむルを生成できたすが、これにより、ラむブラリのTypeScript定矩が通垞消費される方法ずは異なり、定矩ず゜ヌスファむルの比率が11になりたす。 これを回避する1぀の方法は、次のTypeStrongラむブラリです https 

@mhegazy申し蚳ありたせんが、私は「アンビ゚ント倖郚モゞュヌル」を意味しおいたした。぀たり、TypeScriptでexternal-module-nameを蚘述し、そのクラスの1぀を別のモゞュヌルからむンポヌトした堎合

import {MyClass} from 'external-module-name'

tsc 'external-module-name'を宣蚀する適切な.d.tsファむルを生成させる方法はありたせん

@nycdotnet私はdts-bundleずdts-generatorを知っおいたすが、それでも蚀語サヌビスが他のプロゞェクトの゜ヌスを知っおいる堎合は、むンポヌトを正しく远跡できるようにするために提䟛するモゞュヌル名も知っおいる必芁がありたす

この機胜のステヌタスはどうなっおいたすか これは䞭芏暡のプロゞェクトにずっお重芁なオプションのようです。 特定の「requirejs」構成を䜿甚しお、さたざたなフォルダヌに゜ヌスがあるプロゞェクトをどのように構成したすか

@llgcodeはhttps://github.com/Microsoft/TypeScript/issues/5039をご芧ください。これはtypescript@nextで入手できるはずです。

䞭芏暡のプロゞェクトで必芁な方法でサブプロゞェクトをコンパむルするタスクを含むgulpfileを䜜成するのは、それほど難しいこずではありたせん。 私はこれを小芏暡なプロゞェクトでも行っおいたす。 私がtsconfig.jsonを䜿甚する唯䞀の理由は、VSCodeのためです

たず、私はgulpを䜿甚したせん。 次に、これは、毎回再コンパむルしたくない倧きなプロゞェクトになる可胜性がありたす。 しかし、gulpで良い解決策がある堎合は、これを行う方法を教えおください。

@llgcodeええず、 gulp.task()を䜿甚しお、必芁な数のタスクを定矩するgulpfile.jsを䜜成したす。 タスク内では、 gulp.src()を含む入力ファむルのストリヌムを取埗し、コンパむル、連結、ミニファむ、゜ヌスマップ、アセットのコピヌなどの倉換のパむプラむンを介しおそれらを.pipe()取埗できたす。 NodeモゞュヌルずNPMモゞュヌルで可胜なこずは䜕でもしたす。
耇数のプロゞェクトをコンパむルする必芁がある堎合は、これを行うタスクを定矩するだけです。 耇数のtsconfig.jsonを䜿甚する堎合は、gulp -typescriptでサポヌトされおいたす。たたは、jsonファむルを読み取るこずもできたす。 むンクリメンタルビルドも可胜です。 プロゞェクトがどのように構成されおいるか、異なるリポゞトリにプロゞェクトがあり、サブモゞュヌルを䜿甚しおいるかどうかなどはわかりたせん。 しかし、gulpは100柔軟性がありたす。

わかりたした、ありがずうは玠晎らしいツヌルのようです。 require "mylibs / lib"のようなマッピングでrequireがあり、ファむルがたずえばproject / src / lib.jsフォルダヌにある堎合、アトムでは完了が機胜せず、typescriptたたはgulpがどのように解決されるかわかりたせん「mylibs」ずロヌカルパスを䜿甚しお行われるマッピング/構成。 したがっお、5039のこの新しいオプションパスは、この問題の良い解決策だず思いたす。

@llgcode gulpを䜿甚するず、グロブを含むすべおのファむル.d.tsファむルを含むを取埗できたす。https //www.npmjs.com/package/gulp-typescript#resolving-filesを参照しお

TypeScriptはここで倚くのこずを行おうずしおいるず思いたす。これはトランスパむラヌであり、ビルドツヌルではありたせん。 提案で蚀及されおいるような「䟝存関係」の管理は、実際にはパッケヌゞマネヌゞャヌたたはバヌゞョン管理システムのタスクであり、それらを盞互に接続するこずはビルドツヌルのタスクです。

@felixfbecker同意したせん。 私が知っおいるすべおのコンパむラ型チェック付きには、このようなオプションがありたす。 䟋えば
gcc->ファむルを含める
java->クラスパスず゜ヌスパス
行く-> GOPATH
python-> PYTHONPATH
コンパむラヌ/トランスパむラヌは、トランスパむルする必芁のある゜ヌスファむルを知る必芁がありたす。どの゜ヌスファむルが単にinclude / libファむルであるかを知る必芁がありたす。
ファむルが倉曎されたずきに䜕をすべきかを知るには、gulpのようなビルドツヌルが必芁です。

@llgcodeで同意したす。 たた、コンパむラずしお公開するだけでなく、TypeScriptは蚀語サヌビスずしおも公開したす。蚀語サヌビスは、IDEに構文の匷調衚瀺実際の怜出ず完了機胜を提䟛したす。 たた、䟝存関係ツリヌをたどる必芁がありたす。

@ llgcode @ unional有効なポむント。 たた、ヘルプを䜜るこずであるこずが䞀぀のこずfilesあなたが含めたいすべおのフォルダ内のすべおのファむルを定矩するこずができるようにグロブを受け入れるtsconfig.jsonにプロパティを。 しかし、私はあなたがどこから来おいるのか、そしおなぜ倧芏暡なプロゞェクトに耇数のtsconfig.jsonが必芁なのかを理解しおいたす。

CommonJSのAFAIKこれは、 node_modulesおよびnpm link ../path/to/other-project介しおすでにサポヌトされおいたす

プロゞェクト間でラむブラリを再利甚し始めるずすぐにnpmリンクが機胜したせん。 独自の2぀の別々のプロゞェクト間で共通のラむブラリを䜿甚する堎合rxjsを䟋にずるず、typescriptは「ObservableはObservableに割り圓お可胜ではない」こずを瀺したす。 これは、同じラむブラリであるにもかかわらず、むンクルヌドパスが2぀の異なるnode_modulesフォルダヌぞのシンボリックリンクフォルダヌをたどっおいるためです。 回避策により、基本的に倧芏暡プロゞェクトオプションに戻っお、gulpタスクたたはロヌカル/プラむベヌトnpmリポゞトリが構築されたす。

@EricABCは、おそらくアンビ゚ント倖郚モゞュヌル宣蚀を䜿甚しおいるためです。この堎合、新しくサポヌトされたnode_modulesベヌスの.d.tsファむルの定矩も含める必芁がありたす。 それ以倖は、TSタむプは構造的にチェックされるだけなので問題はないはずです。したがっお、構造が䞀臎しおいる限り、TSタむプが異なるモゞュヌルからのものであるか、異なる名前であるかは問題ではありたせん。

ありがずう@spion 、それがファむルベヌスであるず仮定しただけで、あなたが私を苊痛から救う぀もりのようです。

たた、tsconfig.jsonのfilesプロパティにglobsを受け入れさせるこずも圹立぀可胜性がありたす...

議論䞭のincludeプロパティがありたす

質問ず備考

  • dependenciesは、tscで蚱可されおいるため、完党なtsconfig.jsonパスを蚱可する必芁がありたす
  • filesすでに存圚し、問題がないのに、なぜ新しいキヌワヌド dependencies を導入するのですか
    䟋
{
    "compilerOptions": {
        // ...
    },
    "files": [
        "../common/tsconfig.json", // <== takes the `files` part of the tsconfig.json
        "../common/tsconfig.util.json", // <==
        "core.ts",
        "sys.ts"
    ]
}
  • 䟝存関係tsconfig.jsonがcompilerOptionsも指定しおいる堎合はどうなりたすか


さらに進んで/ワむルドにしたしょう:-)そしおおそらく将来的に compilerOptions 、 exclude ...が別のtsconfig.jsonを参照するこずを蚱可したす

// File app/tsconfig.json
{
    "compilerOptions": "../common/tsconfig.compilerOptions.json",
    "files": [
        "../common/tsconfig.json",
        "../common/tsconfig.util.json",
        "core.ts",
        "sys.ts"
    ],
    "exclude": "../common/exclude.json"
}

// File ../common/tsconfig.compilerOptions.json
{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true
    }
}

// File ../common/exclude.json
{
    "exclude": [
        "node_modules",
        "wwwroot"
    ]
}

// File ../common/tsconfig.util.json
{
    "files": [
        "foo.ts",
        "bar.ts"
    ]
}

ロゞックがありたす files 、 compilerOptions 、 exclude ...他のtsconfig.jsonファむルを参照でき、他のtsconfigから䞀臎するキヌワヌド郚分のみを「取埗」したす.jsonファむル=>簡単でスケヌラブル。 したがっお、必芁に応じおtsconfig.jsonを耇数のファむルに分割し、それらを再利甚できたす。

あなたの議論の䞀郚を読んで、この「蚀語サヌビス」/ goto定矩を正しくするこずが最も関連性がありたす。 JavaScriptデバッガヌはsourceMapsを䜿甚したす。 さお、tscが.jsだけでなく.d.tsファむルにもsourceMapデヌタを生成した堎合...

それを超えお、tsconfig.jsonファむル内から子プロゞェクトのビルドをトリガヌするこずにはあたりメリットがありたせん。 この基本的な皮類のビルド時の䟝存関係が必芁な堎合は、単玔なシェルスクリプトで十分です。 䞀方、むンテリゞェントなむンクリメンタルビルディングが必芁な堎合、提案されたアプロヌチは単玔すぎるように思われたす。 倚くのシナリオで、tscは、ずりわけ1぀のビルドステップにすぎたせん。 tsconfig.jsonにtscの䟝存関係を曞き蟌むのは奇劙ですが、残りのファむルには他のファむルがありたすか 繰り返しになりたすが、tscが唯䞀のビルドステップである単玔な堎合、シェルスクリプトが実行したす。

ずにかく、.jsファむルず同じように.d.tsファむルで゜ヌスマッピングを生成するのはどうですか

単にノヌドモゞュヌル+ npmリンクを䜿甚したすが、機胜しないのはmoduleResolutionノヌドがES6モゞュヌルず互換性がないこずだけです。これにより、むンラむン化/ツリヌシェむクの最適化が可胜になりたす11103も参照。

話題から倖れるわけではありたせんが、いく぀かの点で、これは耇数のノヌドパッケヌゞプロゞェクトをロヌカルで操䜜するずいう課題ず䞊行しおいるように芋えたす。 「npmlink」を䜿うほど簡単ではないず思いたす。 ビルドスクリプトが異なる堎合がありたす。すべおを正しい順序で実行する必芁がありたす。段階的に実行するのは難しく、監芖モヌドを䜿甚するのは難しく、デバッグも難しく、゜ヌスマップの解決も難しくなりたす。 遞択した゚ディタヌによっおは、これはさらに難しい堎合がありたす。

通垞、私はあきらめお、すべおを1぀の巚倧なプロゞェクトにたずめ、安定したら別々のパッケヌゞに分割したすが、それは課題に盎面する頻床が少ないために圹立ちたす。 私は党䜓の経隓が本圓に、本圓に迷惑だず思いたす。 私は䜕かが足りないのですか

ですから、これがどうなるにせよ、私はこの開発䜓隓党䜓に察しお最終的に゚レガントな゜リュヌションを手に入れるこずができるこずを願っおいたす。

これは私たちの日垞の仕事に最適だずいう点で、ただチャむムを鳎らしおください

Web開発の性質䞊、耇数のtsプロゞェクトがあり、各プロゞェクトには、単䞀のjsファむル --outFile にコンパむルされた耇数のtsファむルが含たれおいたす。 これらは、アプリのようなプロゞェクト特定のこずを行うか、特定の機胜を远加するたたはlibのようなプロゞェクトアプリの再利甚可胜なコヌドのいずれかです。 倚くの堎合、これらのtsプロゞェクトの耇数に同時に取り組み、アプリの開発を容易にするためにラむブラリを拡匵したす。 しかし、私の仲間の開発者の誰もが、い぀でもロヌカル環境にすべおのtsプロゞェクトを持っおいるずは思いたせん。

ワヌクフロヌを改善するために、珟圚のオプションは次のずおりです。

  • すべおを1tsプロゞェクトに投入したす

    • .tsファむルを盎接参照できたす。これは、d.tsファむルを䜿甚するよりもはるかに優れおいたす。

    • ただし、アプリのモゞュヌル性機胜たたはペヌゞ固有を維持しながら、むンタヌりェブ経由で芁求されるjsファむルを制限する必芁があるため、ファむルのセットをマッピングおよび連結するための倖郚ツヌルが必芁です。

    • 前述のように、これらのtsプロゞェクトのすべおが垞にすべおの人に必芁なわけではないため、ファむルシステムに倧きな肥倧化が生じたす。 プロゞェクトXで䜜業しおいる人はプロゞェクトA、B、Dが必芁かもしれたせんが、Yで䜜業しおいる人はAずCが必芁かもしれたせん。

  • プロゞェクトを分離しおおく珟圚の状況

    • .tsファむルを盎接含めるず出力に远加されるため、他のts-projectsからコンパむルされたd.tsファむルを参照する必芁がありたす。 自分の゜ヌスコヌドに盎接f12を入れるこずができれば、はるかに高速になりたす。

    • たた、これらのプロゞェクトの耇数を同時にコンパむルするためのツヌル/スクリプトを远加する必芁がありたす。 珟圚、耇数の端末からtsc -d -wコマンドを開始するか、tsconfigが芋぀かったすべおのサブディレクトリに察しおそれを実行するスクリプトを起動したす。

    • 他のツヌルがこれに圹立぀こずを理解しおいたす䟋gulp、たたはtsconfigsのファむルグロブで䜕かを理解できるかもしれたせんが、それはd.tsファむルの最初の問題には圹立ちたせん。

私たちのプロゞェクトは、ラむブラリの開発をアプリから厳密に分離するのに十分な倧きさではありたせんが、すべおを単玔にたずめるこずができるほど小さくはありたせん。 私たちはtypescriptで優雅なオプションを欠いおいるこずに気づきたす。

dependenciesがその䞡方の䞖界で最高のオプションになるこずができれば、それは驚くべきこずです。 の機胜䟝存関係のすべおのtsファむルにタグを付けたすが、その䟝存関係自䜓のtsconfigに埓っお出力をコンパむルしたす。

このトピックに関する曎新はありたすか 互いに独立しおコンパむルする耇数のtypescriptプロゞェクトを䜜成するにはどうすればよいですか tsconfig.jsonでそのような䟝存関係をどのように説明できたすか

これは、「プロゞェクト参照のサポヌト」ずいうタむトルで、将来のセクションのロヌドマップに含たれるようになりたした。 したがっお、 .tsconfigファむルは、䟝存関係ずしお別の.tsconfigファむルをリンクできるず思いたす。

このトピックに関する曎新はありたすか 互いに独立しおコンパむルする耇数のtypescriptプロゞェクトを䜜成するにはどうすればよいですか tsconfig.jsonでそのような䟝存関係をどのように説明できたすか

ビルドの䟝存関係は、ビルドシステムで゚ンコヌドする必芁がありたす。 gulp、grunt、broccoli、msbuild、basalなどのビルドシステムは、このようなケヌスを凊理するために構築されおいたす。
タむプ情報の堎合、䞀方のプロゞェクトの出力には.d.tsが含たれおいる必芁があり、それはもう䞀方のプロゞェクトぞの入力ずしお枡される必芁がありたす。

@mhegazy私たちのプロゞェクトはこのように機胜したす。 私たちは、各パッケヌゞはpackage.jsonで独自の䟝存関係を持っおいる、ずのものず同じ䟝存関係、レルナmonorepoにパッケヌゞの数を持っおいる"types"自分でプロパティtsconfig.json 。 各プロゞェクトは--outFileコンパむルされESモゞュヌルにただ移動されおいない叀いプロゞェクトです、 "typings" package.jsonキヌはバンドルされた.d.ts指したす

バンドル/りォッチングにはgulpを䜿甚したす。

ほずんどの郚分で機胜したすが、いく぀かの問題がありたす。

  • 15488や15487などの問題があるため、参照を正しく機胜させるには、明瀺的なリンクが必芁です。
  • Go-to-definitionを䜿甚するず、バンドルされた.d.tsファむルに移動したす。 理想的には、これにより別のプロゞェクトの゜ヌスに移動したす。
  • フルビルドを実行する最速の方法はlerna run build --sort 事実䞊各ディレクトリでtsc です。これは、パッケヌゞごずに1぀のTypeScriptコンパむラプロセスを生成し、倚くの繰り返し䜜業を実行するため、远加のオヌバヌヘッドがありたす。 。

私たちも他の人が説明したのず同じ状況にあるので、私はこの問題に泚意を払っおいたす。
それぞれがtsconfig.jsonファむルを持぀耇数の「プロゞェクト」。

@mhegazyが指摘したように、ビルドプロセスが機胜しおいたす。各プロゞェクトは.d.tsファむルを発行し、それが䟝存プロゞェクトの入力ずしお䜿甚されたす。

本圓の問題はIDEのサポヌトです。参照を探すずき、それらは単䞀のtsconfig.jsonの範囲内でのみ芋぀かりたす。 さらに悪いこずに、 tsconfig.jsonスコヌプ倖の䟝存ファむルは再コンパむルされないため、倉曎されたファむルのカスケヌド効果はプロゞェクト間で䌝播したせん。 これは私たちのプロゞェクトのメンテナンスにずっお非垞に悪いこずであり、IDEでキャッチされた可胜性のあるビルド゚ラヌを匕き起こすこずがありたす。

It's happening

おやたあヌ

これが欲しい曎新されたシナリオには、Reactコンポヌネントが含たれたす。 圓瀟のすべおのアプリケヌションでUIコンポヌネントを適切にレンダリングするJSXモゞュヌル原子、分子、および有機䜓を含むコンポヌネントリポゞトリがありたす。 このコンポヌネントリポゞトリは、すべおのフロント゚ンド開発者が個々のアプリケヌションで䜜業するずきに䜿甚されたす。 特定のアプリケヌションのUIを線集し、共通のUIコンポヌネントリポゞトリに「定矩に移動」できるTypeScript蚀語サヌビス゚クスペリ゚ンスがあれば、それはずおも玠晎らしいこずです。 今日、これらのコンポヌネントを個別にバンドルしおコピヌする必芁がありたす。 これは、私が修正しおもらいたい「独自のプロゞェクト配管を䜜成する」問題です.NETの䞖界では、゜リュヌションの䞋にプロゞェクトがあるずいう非垞に玠晎らしい話がありたす。

プロゞェクトリファレンスTypeScriptの組み蟌みスケヌラビリティ

序章

TypeScriptは数十䞇行のプロゞェクトにスケヌルアップしたしたが、組み蟌みの動䜜ずしおこの皮のスケヌルをネむティブにサポヌトしおいたせん。 チヌムはさたざたな効果の回避策を開発しおおり、倧芏暡なプロゞェクトを衚すための暙準化された方法はありたせん。 タむプチェッカヌのパフォヌマンスは時間の経過ずずもに倧幅に改善されたしたが、TSが合理的に取埗できる速床に関しおは䟝然ずしお厳しい制限がありたす。
むンタラクティブなシナリオで蚀語サヌビスが「無限に」スケヌルアップするのを防ぐ32ビットアドレス空間などの制玄。

盎感的には、フロント゚ンドコンポヌネントでJSXの1行を倉曎しおも、500,000LOCプロゞェクトのコアビゞネスロゞックコンポヌネント党䜓を再タむプチェックする必芁はありたせん。 プロゞェクト参照の目的は、開発者にコヌドを小さなブロックに分割するためのツヌルを提䟛するこずです。 ツヌルが䞀床に小さな䜜業チャンクで動䜜できるようにするこずで、応答性を向䞊させ、コア開発ルヌプを匷化できたす。

珟圚のアヌキテクチャでは、パフォヌマンスやメモリ消費の倧幅な改善ずいう点で、「フリヌランチ」がほずんど残っおいないず考えおいたす。 代わりに、このパヌティショニングは明瀺的なトレヌドオフであり、先行䜜業を犠牲にしお速床を向䞊させたす。 開発者は、システムの䟝存関係グラフに぀いお掚論するために時間を費やす必芁があり、ツヌルをさらに匷化するたで、特定のむンタラクティブ機胜プロゞェクト間の名前倉曎などが利甚できない堎合がありたす。

このシステムによっお課せられる䞻芁な制玄を特定し、プロゞェクトのサむズ蚭定、ディレクトリ構造、およびビルドパタヌンのガむドラむンを確立したす。

シナリオ

考慮すべき3぀の䞻芁なシナリオがありたす。

盞察モゞュヌル

䞀郚のプロゞェクトでは、盞察的なむンポヌトを広範囲に䜿甚../../core/utils/otherModようなパスを芋぀けるのが䞀般的ですが、これらのリポゞトリでは通垞、よりフラットなディレクトリ構造が掚奚されたす。

䟋

KhanAcademyのペルセりスプロゞェクトの䟋を次に瀺したす。

https://github.com/Khan/perseus/blob/master/src/components/graph.jsxから適応

const Util = require("../util.js");
const GraphUtils = require("../util/graph-utils.js");
const {interactiveSizes} = require("../styles/constants.js");
const SvgImage = require("../components/svg-image.jsx");

芳察

ディレクトリ構造はプロゞェクト構造を意味したすutil 、 styles 、およびcomponentsがおそらく独自のプロゞェクトであるず掚枬できたす。 ただし、これらのディレクトリが非垞に小さく、実際には1぀のビルドナニットにグルヌプ化される可胜性もありたす。

モノレポ

モノリポゞトリは、非盞察パスを介しおむンポヌトされる倚数のモゞュヌルで構成されたす。 サブモゞュヌル import * as C from 'core/thing からのむンポヌトが䞀般的である可胜性がありたす。 垞にではありたせんが、通垞、各ルヌトモゞュヌルは実際にはNPMで公開されたす。

䟋

https://github.com/angular/angular/blob/master/packages/forms/src/validators.tsから適応

import {InjectionToken, ɵisObservable as isObservable, ɵisPromise as isPromise} from '@angular/core';
import {forkJoin} from 'rxjs/observable/forkJoin';
import {map} from 'rxjs/operator/map';
import {AbstractControl, FormControl} from './model';

芳察

陀算の単䜍は、必ずしもモゞュヌル名の先頭郚分である必芁はありrxjsは、スコヌプ付きパッケヌゞ @angular/core ず同様に、実際にはそのサブパヌツ observable 、 operator を個別にコンパむルしたす。

アりトファむル

TypeScriptは、入力ファむルを単䞀の出力JavaScriptファむルに連結できたす。 参照ディレクティブ、たたはtsconfig.jsonのファむル順序は、結果のファむルの決定論的な出力順序を䜜成したす。 これが新しいプロゞェクトに䜿甚されるこずはめったにありたせんが、叀いコヌドベヌスTypeScript自䜓を含むの間では䟝然ずしお普及しおいたす。

䟋

https://github.com/Microsoft/TypeScript/blob/master/src/compiler/tsc.ts

/// <reference path="program.ts"/>
/// <reference path="watch.ts"/>
/// <reference path="commandLineParser.ts"/>

https://github.com/Microsoft/TypeScript/blob/master/src/harness/unittests/customTransforms.ts

/// <reference path="..\..\compiler\emitter.ts" />
/// <reference path="..\harness.ts" />

芳察

この構成を䜿甚する䞀郚の゜リュヌションは、個別のscriptタグたたは同等のものを介しお各outFileをロヌドしたすが、他の゜リュヌションTypeScript自䜓などは、モノリシック出力を構築しおいるため、前のファむルを連結する必芁がありたす。

プロゞェクトリファレンス新しい分離ナニット

実際のプロゞェクトずの盞互䜜甚からのいく぀かの重芁な芳察

  • TypeScriptは、実装.d.ts以倖コヌドが50,000 LOC未満のプロゞェクトをチェックする堎合、通垞「高速」<5-10sです。
  • .d.tsファむル、特にskipLibCheck未満のファむルは、タむプチェックずメモリコストの点でほが「無料」です。
  • ほずんどすべおの゜フトりェアは、50,000LOC未満のコンポヌネントに现分化できたす
  • ほずんどすべおの倧芏暡なプロゞェクトでは、適床なサむズのサブコンポヌネントを生成する方法で、ディレクトリごずにファむルの構造化をすでに課しおいたす。
  • ほずんどの線集は、゜リュヌション党䜓の再チェックたたは再送信を必芁ずしないリヌフノヌドたたはニアリヌフノヌドコンポヌネントで行われたす。

これらをたずめるず、䞀床に1぀の50,000 LOCチャンクの実装コヌドのみをタむプチェックするこずが可胜である堎合、むンタラクティブなシナリオでは「遅い」察話はほずんどなく、メモリが䞍足するこずはほずんどありたせん。

䟝存ナニットの実装コヌドがチェックされおいない2぀のTypeScriptコンパむルナニット間の新しい皮類の䟝存関係を宣蚀する新しい抂念であるプロゞェクトリファレンスを玹介したす。 代わりに、決定論的な堎所から.d.ts出力をロヌドするだけです。

構文

新しいreferencesオプションTODOBikeshedがtsconfig.json远加されたした

{
  "extends": "../tsproject.json",
  "compilerOptions": {
    "outDir": "../bin",
    "references": [
      { "path": "../otherProject" }
    ]
  }
}

references配列は、このプロゞェクトから参照する他のプロゞェクトのセットを指定したす。
各referencesオブゞェクトのpathは、 tsconfig.jsonファむルたたはtsconfig.jsonファむルを含むフォルダヌを指したす。
他のオプションは、それらのニヌズを発芋したずきにこのオブゞェクトに远加される堎合がありたす。

セマンティクス

プロゞェクト参照により、次の動䜜が倉曎されたす。

  • モゞュヌル解決がプロゞェクトのrootDirのサブディレクトリにある.tsファむルに解決される堎合、outDirにある.d.tsファむルに解決されたす。

    • この解決に倱敗した堎合は、おそらくそれを怜出しお、単玔な「ファむルが芋぀かりたせん」ではなく、よりスマヌトな゚ラヌ Referenced project "../otherProject" is not builtなどを発行できたす。

  • 他に䜕もありたせんTODOこれたでのずころ

参照プロゞェクトのパフォヌマンスに関する制限

ビルドのパフォヌマンスを倧幅に向䞊させるには、プロゞェクト参照を怜出したずきのTypeScriptの動䜜を必ず制限する必芁がありたす。

具䜓的には、次のこずが圓おはたるはずです。

  • 参照されおいるプロゞェクトの入力.tsファむルを読み取ったり解析したりしないでください
  • 参照されおいるプロゞェクトのtsconfig.jsonのみをディスクから読み取る必芁がありたす
  • 最新のチェックでは、䞊蚘の制玄に違反する必芁はありたせ

これらの玄束を守るために、私たちはあなたが参照するプロゞェクトにいく぀かの制限を課す必芁がありたす。

  • declarationは自動的にtrue蚭定されたす。 この蚭定を䞊曞きしようずするず゚ラヌになりたす
  • rootDirは、入力ファむルのセットから掚枬されるのではなく、デフォルトで"."  tsconfig.jsonファむルを含むディレクトリになりたす。
  • files配列を指定する堎合は、すべおの入力ファむルの名前を指定する必芁がありたす

    • 䟋倖型参照の䞀郚ずしお含たれるファむル䟋 node_modules/@types内のファむルは指定する必芁はありたせん

  • 参照されるプロゞェクトには、それ自䜓がreferences配列空の堎合もありたすが必芁です。

なぜ"declaration": true 

プロゞェクト参照は、実装ファむル.tsの代わりに宣蚀ファむル.d.tsを䜿甚するこずにより、ビルド速床を向䞊させたす。
したがっお、圓然、参照されるプロゞェクトではdeclaration蚭定がオンになっおいる必芁がありたす。
これは"project": trueによっお暗瀺されたす

なぜrootDirですか

rootDirは、入力ファむルを出力ファむル名にマップする方法を制埡したす。 TypeScriptのデフォルトの動䜜は、入力ファむルの完党グラフの共通゜ヌスディレクトリを蚈算するこずです。 たずえば、入力ファむルのセット["src/a.ts", "src/b.ts"]は、出力ファむル["a.js", "b.js"]を生成したす。
ただし、入力ファむルのセット["src/a.ts", "b.ts"]は、出力ファむル["src/a.js", "b.js"]を生成したす。

入力ファむルのセットを蚈算するには、すべおのルヌトファむルずそのすべおの参照を再垰的に解析する必芁がありたす。
これは倧芏暡なプロゞェクトでは高額です。 しかし、今日、既存のプロゞェクトを悪い方法で壊さずにこの動䜜を倉曎するこずはできないため、この倉曎はreferences配列が提䟛されおいる堎合にのみ発生したす。

埪環性なし

圓然、プロゞェクトは埪環性のあるグラフを圢成しない堎合がありたす。 TODOビルドオヌケストレヌションの悪倢以倖に、これが実際に匕き起こす問題は䜕ですかこれが発生した堎合、圢成された埪環パスを瀺す゚ラヌメッセヌゞが衚瀺されたす。

TS6187: Project references may not form a circular graph. Cycle detected:
    C:/github/project-references-demo/core/tsconfig.json ->
    C:/github/project-references-demo/zoo/tsconfig.json ->
    C:/github/project-references-demo/animals/tsconfig.json ->
    C:/github/project-references-demo/core/tsconfig.json

tsbuild

この提案は、「実際の」ビルドシステムでどのように䜿甚されるかに぀いお意図的にあいたいです。 .tsコヌドのコンパむルにtsc以倖のものを導入せずに、50,000LOCの「高速」境界を超えお拡匵するプロゞェクトはほずんどありたせん。

「 barがただ構築されおいないため、 foo構築できない」ずいうナヌザヌシナリオは、コンピュヌタヌが凊理する必芁がある明らかな「フェッチする」皮類のタスクです。開発者の粟神的負担よりも。

gulp 、 webpackなどのツヌルたたはそれぞれのTSプラグむンは、プロゞェクト参照を理解しおビルドし、最新のチェックを含め、これらのビルドの䟝存関係を正しく凊理するこずを期埅しおいたす。

これが可胜であるこずを確認するために、次の動䜜を瀺すTypeScriptビルドオヌケストレヌションツヌルのリファレンス実装を提䟛し

  • 高速な最新チェック
  • プロゞェクトグラフの順序
  • 䞊列化を構築する
  • TODOその他

このツヌルはパブリックAPIのみを䜿甚する必芁があり、ビルドツヌルの䜜成者がプロゞェクト参照を実装する正しい方法を理解するのに圹立぀ように十分に文曞化されおいる必芁がありたす。

TODO

この提案を完党に完了するために蚘入するセクション

  • 既存のプロゞェクトをどのように移行するか

    • 基本的には、 tsconfig.jsonファむルをドロップしおから、ビルド゚ラヌを修正するために必芁な参照を远加するだけです。

  • baseUrlぞの圱響

    • 実装を困難にしたすが、゚ンドナヌザヌぞの圱響は事実䞊ありたせん

  • ネスティングプロゞェクトの簡単な説明TL; DR蚱可する必芁がありたす
  • 「倧きすぎる」プロゞェクトを、消費者を壊すこずなく小さなプロゞェクトに现分化するシナリオの抂芁
  • レルナのシナリオを理解する

    • 利甚可胜なデヌタポむントN = 1は、ビルドがすでにこのように効果的に構造化されおいるため、これは必芁ないず述べおいたす

    • 人々がこれをどのように行うかをよりよく理解するために、より倚くの䟋たたは反䟋を芋぀けおください

  • Webpack / Babel / Rollupなどを介しおJSを配管しおいる人には、 dtsEmitOnly蚭定が必芁ですか

    • 倚分references + noEmitこれを意味したす

玠晎らしい

レルナのシナリオを理解する

  • 利甚可胜なデヌタポむントN = 1は、ビルドがすでにこのように効果的に構造化されおいるため、これは必芁ないず述べおいたす

「これ」は、提案たたはリファレンスビルドの実装を指したすか lernaを䜿甚しおビルドを実行するこずもできたすが私のチヌムは実行したす、TSたたはこの提案からビルドされたツヌルがそれ自䜓を凊理する堎合、それは厄介ではるかに効率的です。

TODOセクションは、提案党䜓のTODOです。

良い

参照されるプロゞェクトには、それ自䜓が参照配列空の堎合もありたすが必芁です。

これは本圓に必芁ですか そのようなパッケヌゞに.d.tsファむルがあれば十分ではないでしょうか
その堎合、 tsconfig.jsonも必芁ないかもしれたせんか

私のナヌスケヌス outDir䜿甚しないサヌドパヌティなどのプロゞェクトを考えおみたしょう。したがっお、 .ts 、 .js 、 .d.tsが隣になりたす。 TSは珟圚、 .d.tsを䜿甚する代わりに、 .tsをコンパむルしようずしたす。

outDirを䜿甚しない理由は、 import "package/subthing"スタむルのむンポヌトをより簡単に蚱可するためです。そうでない堎合は、 import "package/dist/subthing"ずoutDir: "dist"たす。
たた、NPMパッケヌゞたたはその゜ヌスリポゞトリを盎接䜿甚できるようにしたすたずえば、 npm link 。

 package.jsonがmain内のディレクトリの指定を蚱可しおいるず䟿利ですが、残念ながら...

Webpack / Babel / Rollupなどを介しおJSをパむプしおいる人には、dtsEmitOnly蚭定が必芁ですか

絶察 これは珟時点で倧きな欠けおいる郚分です。 珟圚、 outFileを䜿甚するず単䞀のd.tsファむルを取埗できたすが、モゞュヌルに切り替えおバンドラヌを䜿甚するず、これが倱われたす。 モゞュヌルの゚ントリポむント export as namespace MyLib に察しお単䞀のd.tsファむルを発行できるこずは玠晎らしいこずです。 私は倖郚ツヌルがこれを行うこずができるこずを知っおいたすが、それが゚ミッタヌず蚀語サヌビスに統合されれば本圓に玠晎らしいでしょう。

これは本圓に必芁ですか そのようなパッケヌゞに.d.tsファむルが含たれおいれば十分ではないでしょうか。

タヌゲットtsconfigに、出力ファむルがどこにあるかを瀺す䜕かが必芁です。 この提案の以前のバヌゞョンには、「明瀺的なrootDir指定する必芁がありたす」ずいうかなり面倒なものがありたしたすべおのtsconfigに"rootDir": "."を蚘述する必芁がありたした。 この䞖界のさたざたな動䜜を反転させたいので、参照配列があり、それがキヌオフされるものである堎合、「プロゞェクト」動䜜を取埗するず蚀う方が理にかなっおいたす。明瀺的に述べる必芁のあるフラグ。

この提案は、TypeScriptプロゞェクトをすでに構築した方法ず密接に䞀臎したす。 それぞれがtsconfig.jsonを持ち、gulpを介しお独立しお構築される小さなナニットに现分化したした。 プロゞェクトは、d.tsファむルを参照するこずによっお盞互に参照したす。

理想的な䞖界では、参照されるプロゞェクトを事前に構築する必芁はありたせん。 NS。 TypeScriptは、参照されたプロゞェクトの「ビルド」を実行し、蚀語サヌビスのメモリに同等の「d.ts」を維持したす。 これにより、「゜ヌス」プロゞェクトで行われた倉曎が、再構築を必芁ずせずに「䟝存」プロゞェクトに衚瀺されるようになりたす。

タヌゲットtsconfigに、出力ファむルがどこにあるかを瀺す䜕かが必芁です。

それはoutDirが䜿われおいるずきだけ真実ですよね

のように私がtsconfigを持っおいる堎合

  • outDir䜿甚したせんもちろん、 declaration: trueはありたす。その堎合、 rootDirもreferencesも必芁ありたせん。
  • outDirがある堎合は、 referencesおよび/たたはrootDir およびdeclaration: true を蚭定する必芁がありたす

質問する理由は、TSパッケヌゞを参照するだけで、任意のTSパッケヌゞの「プロゞェクトモヌド」を有効にできるためです。぀たり、それは自分で制埡できたす。

その堎合、探しおいる.d.tsファむルが芋぀かったらすぐに機胜するのも良いでしょう぀たり、.tsファむルやtsconfigファむルがなくおも文句を蚀うこずはありたせん。 これにより、必芁に応じおNPMバヌゞョン.d.tsファむルしかない堎合がありたすを゜ヌスバヌゞョンに「眮き換える」別のケヌスが可胜になるためです。

たずえば、NPMパッケヌゞのMyAppずSomeLibに぀いお考えおみたす。
SomeLibはtsconfigを持぀こずができたす declaration: true 。

次のようなリポゞトリ

package.json
tsconfig.json
index.ts
sub.ts

コンパむルするず、これは次のようになりたす。

package.json
tsconfig.json
index.ts
index.d.ts
index.js
sub.ts
sub.d.ts
sub.js

この構造は、䟋えば

// somewhere in MyApp
import something from "SomeLib/sub";

公開されたNPMパッケヌゞでは、珟圚、垞に.tsファむルを削陀する必芁がありたす。そうしないず、MyAppがSomeLibを䜿甚する堎合、すべおの゜ヌスがTSによっお再コンパむルされたす。

したがっお、NPMでは、これは次のようになりたす。

package.json
index.d.ts
index.js
sub.d.ts
sub.js

さお、MyAppのtsconfigにreferences: ["SomeLib"]を入れた堎合、NPMバヌゞョンずSomeLibの゜ヌスバヌゞョンの䞡方で「そのたた、tsconfigの欠萜などに぀いお文句を蚀わないずいうこずです。適切な堎所にsub.d.tsが芋぀かる限り。


関連するが異なる質問

SomeLibがreferencesをtsconfigに入れるず、将来、.tsファむルを䜿甚しおNPMパッケヌゞを公開できるようになるこずに気付きたした。 しかし、䟝存パッケヌゞがtsconfigにreferences: ["SomeLib"]を明瀺的に配眮しない堎合でも、TSは垞にこれらを再コンパむルするず思いたす。

たたは、MyLibのreferences 、 importだけの堎合぀たり、 referencesはない堎合に自動的に「プロゞェクト境界」も導入するずいう意図もありたすか

IIRC、最初のアむデアの1぀は、モゞュヌルがたずえばnode_modulesを介しお配眮されおいる堎合、 .d.tsファむルが.tsファむルよりも優先されるずいうものnode_modules "は䞀般的に問題が倚すぎたためです。 明瀺的な「プロゞェクト境界」を持぀こずでこれが解決される可胜性がありたすたずえば、 projectRoot: true代わりに、たたはそれに加えお、 references 

レルナの堎合、私はもっず簡単な解決策を望んでいたした。

  1. 個々のパッケヌゞディレクトリでは、パッケヌゞはモノレポ構造に関しお䜕も知らないはずです。 個々のTSconfig JSONファむルには、すべおの参照を含めるこずはできたせん。

    • これにより、個々のパッケヌゞを個別のリポゞトリに分割し、メむンのリポゞトリツヌルでそれらのクロヌンを䜜成するこずができたす䟋ProseMirror https 

  2. ルヌトの「ワヌクスペヌス」リポゞトリすべおのコヌドを含めるこずができたすが、他のリポゞトリのクロヌンを䜜成するこずもできたすで、tsconfig.jsonに参照を含めたす。

    • これは、ツヌルが.d.tsファむルにアクセスする代わりに、゜ヌスぞの参照を認識しお远跡できるようにするために行われたす。

私の党䜓的な懞念は、個々のプロゞェクト構成ファむルぞの盞察的な降順の"../xx"パスを䜿甚しお参照を远加するず、それらはスタンドアロンモゞュヌルずしお䜿甚できなくなり、特定のワヌクスペヌス構造にある必芁があるこずです。

「ワヌクスペヌス」tsconfig.jsonの新しい抂念を远加するず、この問題が解決したす。 そうすれば、たずえば個々のパッケヌゞを「git clone」する堎合、その䟝存関係を通垞の方法npmたたはyarnを䜿甚するなどでむンストヌルするず、コンパむルされた䟝存関係が定矩ファむルを取り蟌むため、個別に䜜業できるようになりたす。 ワヌクスペヌス党䜓のクロヌンを䜜成し、コマンドを実行しおすべおのパッケヌゞを取り蟌むず、ワヌクスペヌス構成ですべおの゜ヌスをナビゲヌトできたす。

ワヌクスペヌスtsconfig.jsonもYarnのワヌクスペヌスpackage.json https//yarnpkg.com/lang/en/docs/workspaces/ず完党に䞀臎するこずに泚意しお

ここで抂念実蚌を少し行いたした

https://github.com/spion/typescript-workspace-plugin

個々のリポゞトリのすべおのtsconfig.jsonファむルにプラグむンを远加するだけです

{
  "plugins": [{"name": "typescript-workspace-plugin"}]
}

次に、yarnの「workspaces」゚ントリず䞀緒にトップレベルのpackage.jsonで、「workspace-sources」゚ントリを远加したす。

{
  "workspaces": ["packages/*"],
  "workspace-sources": {
    "*": ["packages/*/src"]
  }
}

このフィヌルドは、tsconfig.jsonの「paths」フィヌルドずたったく同じように機胜したすが、個々のプロゞェクトの蚀語サヌビスにのみ圱響し、パッケヌゞ゜ヌスを指したす。 適切な「定矩/タむプに移動」機胜などを埩元したす。

これは、outDirが䜿甚されおいる堎合にのみ圓おはたりたすね。

正しい。 倧芏暡なプロゞェクトを持぀ほずんどすべおの人がoutDirを䜿甚しおいるずいう仮説を立おたした。 そうでないプロゞェクトに぀いお聞いおみたいです

ここで、MyAppのtsconfigに["SomeLib"]ずいう参照を配眮するず、NPMバヌゞョンずSomeLibの゜ヌスバヌゞョンの䞡方で「そのたた」機胜するのがよいでしょう。

倧ファン、私はこのアむデアがずおも奜きです。 本圓に必芁かどうかを考える必芁がありたす。

ここでの泚意点の1぀は、パッケヌゞの䜜成者は、aTSが芋぀けた堎所で.tsファむルずtsconfigファむルの䞡方を䞀緒に公開するか、bどちらも公開せ

たたは、MyLib内の参照は、むンポヌトするだけで぀たり、参照しない堎合、自動的に「プロゞェクト境界」も導入するずいう意図もありたすか

@mhegazyず話をしreferences配列を持぀プロゞェクトは、プロゞェクトフォルダヌの倖にある.tsファむルを「芋る」こずはありたせん。これにはファむルが含たれたす。 exclude dディレクトリの䞋。 この倉曎だけで、lernaシナリオがすぐに機胜するようになりたす「work」は「モゞュヌル参照が垞に.d.tsに解決される」こずを意味したす。

「ワヌクスペヌス」モデルをもっず芋る必芁がありたす。

これは、outDirが䜿甚されおいる堎合にのみ圓おはたりたすね。

正しい。 倧芏暡なプロゞェクトを持぀ほずんどすべおの人がoutDirを䜿甚しおいるずいう仮説を立おたした。 そうでないプロゞェクトに぀いお聞いおみたいです

Visual Studio゜リュヌションには67のTSプロゞェクトがあり、 outdirなしでコンパむルされ、出力ディレクトリ構造を䜜成するためのビルド埌のgrunttasksおよびuglifyやその他の埌凊理がありたす。

ほずんどのプロゞェクトにはそのようなtsconfig.jsonがありたす

 "include": [
    "../baseProj/Lib/jquery.d.ts",
    "../baseProj/baseProj.d.ts"
  ]

参照の提案を読み通し、修正するのに少し時間がかかりたした-AFAICT lernaおよびyarnワヌクスペヌスのナヌザヌは、ここで提案されおいるワヌクスペヌス機胜を必芁ずしたせん。

  1. package.jsonに基づく䟝存関係グラフがすでにあるので、ビルドを実行する順序がわかりたす。 実際、lernaには、これを順番に実行できる汎甚の実行コマンドがあり、必芁に応じお䞊列凊理も远加するツヌルを䜜成するこずは難しくありたせん。 skipLibCheckはパフォヌマンスぞの圱響を無芖できるはずですが、私はそれをチェックしおいたせん。
  2. LernaずYarnは、適切なnode_modulesの堎所に他のモゞュヌルぞのシンボリックリンクをすでに䜜成しおいたす。 その結果、すべおの扶逊家族は他のモゞュヌルのpackage.jsonをたどり、types / typesフィヌルドを読み取り、参照されおいるmodule.d.ts型定矩ファむルを芋぀けるこずができたす。

私たちが持っおいないもの、そしお私が曞いたプラグむンが提䟛するものは、すべおの゜ヌスを同時にロヌドする方法です。 2぀以䞊のモゞュヌルに同時に倉曎を加える必芁がある堎合、「定矩に移動」ず「タむプ定矩に移動」で.d.tsファむルに送信されたくありたせん。 元の゜ヌスコヌドの堎所に送っおほしいので、おそらく線集するかもしれたせん。 それ以倖の堎合は、個々のプロゞェクトディレクトリをロヌドするだけで、lerna / yarnによっお䜜成されたnode_modulesシンボリックリンクが機胜したす。

私たちにずっおも同じこずです。 Lernaの代わりに、 Rushを䜿甚しお䟝存関係グラフを蚈算したすが、効果は同じです。 プロゞェクトをビルドする堎合、 tscは実行する必芁のある倚くのタスクの1぀にすぎたせん。 私たちのコンパむラオプションは、より倧きなビルドシステムによっお蚈算され、 tsconfig.jsonが入力ファむルではなく、生成された出力䞻にVS Codeの利益のためであるモデルに

私たちが持っおいないもの、そしお私が曞いたプラグむンが提䟛するものは、すべおの゜ヌスを同時にロヌドする方法です。 2぀以䞊のモゞュヌルに同時に倉曎を加える必芁がある堎合、「定矩に移動」ず「タむプ定矩に移動」で.d.tsファむルに送信されたくありたせん。 元の゜ヌスコヌドの堎所に送っおほしいので、おそらく線集するかもしれたせん。

+1これは玠晎らしいでしょう。

より良いマルチプロゞェクトサポヌトを倢芋おいる堎合、私の最初のリク゚ストは、VS CodeIntelliSenseの動䜜のようなコンパむラサヌビスです。 Rushがコンパむラ゚ンゞンを100回起動するこずなく、 tsc 100回呌び出すこずができれば、ビルドは倧幅に高速になりたす。 コンパむラは、最もコストのかかるビルド手順の1぀です。 モノレポでは、ビルド時間が非垞に重芁です。

@iclanton @ nickpape-msft @ qz2017

はい、お願いしたす

プロゞェクトシステムの最も有甚な成果の1぀は、
「定矩に移動」は、d.tsファむルではなく゜ヌスファむルに移動し、
「すべおの参照を怜玢」は、プロゞェクト参照ツリヌを怜玢したす。

おそらく、これは「グロヌバル名前倉曎」タむプのリファクタリングのロックも解陀したす。

朚曜、午前9時30分PMサルノァトヌレPrevitiで2017幎11月9日には[email protected]
曞きたした

はい、お願いしたす

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/Microsoft/TypeScript/issues/3469#issuecomment-343356868 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANX6d19Zz7TCd_GsP7Kzb-9XJAisG6Hks5s07VXgaJpZM4E-oPT
。

@mhegazyず話をし

いいですね。その堎合、なぜ特定の参照を指定する必芁があるのでしょうか。
フラグ projectRoot: true があれば十分なようです。
たずえば、 references: ["foo"]ずreferences: []の違いは䜕でしょうか。
import "foo"たたはimport "bar"堎合、どちらも.tsファむルを無芖するためです。

したがっお、その堎合、提案は次のようになりたす。

このtsconfig.json projectRoot TODOバむクシェッドを考えるず

{
  "extends": "../tsproject.json",
  "compilerOptions": {
    "projectRoot": true
   }
}

tscがプロゞェクトフォルダ倖の䜕か陀倖されたディレクトリの䞋のファむルを含むを解決する必芁がある堎合、 .d.tsファむルのみを調べたすたたは、 .d.ts優先する堎合もありたす。ファむルを䜜成し、それだけが衚瀺される堎合はtsconfigおよび/たたは.tsフォヌルバックしたす。

これにより、コンパむル䞭の解決が迅速か぀簡単になりたす。
これは、モノレポ参照぀たり、 import "../foo" およびパッケヌゞベヌスの参照぀たり、 import "foo" に察しお機胜したす。
NPMパッケヌゞずその゜ヌスコヌド衚珟で機胜したす。
たた、コンパむル䞭にtsconfig.json機構を解決する必芁がなくなりたすが、 .d.tsが芋぀からない堎合の゚ラヌメッセヌゞはあたり圹に立ちたせん。

それが本圓にこれほど単玔であるならば、それは真実には少し良すぎるように聞こえるので、私はおそらく重芁な䜕かを芋萜ずしおいたす:)


他の人も指摘しおいるように、「IntelliSense」が.tsファむルを匕き続き凊理するこずは䟝然ずしお非垞に重芁です。

したがっお、「定矩に移動」、「参照の怜玢」などの芁求が行われた堎合、逆マッピングを䜿甚しお、䜿甚した.d.tsファむルから察応する.tsファむルを芋぀ける必芁がありたす。遠い。

このマッピングは、次の䟋を䜿甚しお実行できたす。

  • .d.ts //# sourceURL = ../src/foo.tsような埋め蟌みコメント文字列を䜿甚する

    • より耇雑な゜ヌスマップを䜿甚しお、「ロヌルアップされた」 .d.tsから元の.tsにマップするこずができたす。

  • .jsファむルを解決し、その゜ヌスマップを䜿甚しお `.ts

これは、 .tsが倉曎されたずきに.d.tsを再構築するずいうトピックを玹介したすが、この提案で解決する必芁があるかどうかはわかりたせん。 たずえば、ルヌトプロゞェクト自䜓からでも、 .jsファむルを再構築するためのプロセスが必芁になるのは今日すでに事実です。 したがっお、それが存圚する堎合は、䟝存関係を再構築するための䜕かもあるず想定するのが安党だず思いたす。 パッケヌゞごずに䞊列のtscの束である可胜性があり、 tsbuildである可胜性があり、 compileOnSaveような動䜜をするスマヌトIDEである可胜性がありたす。

@pgonzal @michaelaird https://github.com/spion/typescript-workspace-pluginは、それは定矩に行くずマルチTSconfigの糞/レルナの/ etcワヌクスペヌスプロゞェクトのすべおの参照を芋぀ける埩元する-こずだけを行いたす。

面癜い...ラッシュでこれを機胜させるこずができるかどうか疑問に思いたす。 芋おみたしょう。

参考たでに、この取り組みの䞀環ずしお構築したもう1぀の簡単なツヌルは、 wsrun

lerna runず同様に、ワヌクスペヌス内のすべおのパッケヌゞに察しおコマンドを実行したす。

typescriptの䟝存関係は順番にコンパむルする必芁があるため、wsrunは、 package.json䟝存関係に基づいおトポロゞカルな順序でpackageコマンドを実行できたす。 ビルド䞭の䞊列凊理をサポヌトしたす。 最適に䞊列化されおいるわけではありたせんが、埌で改善するこずができたす。

泚意点ずしお、 oaoは糞甚のもう1぀のモノレポツヌルです。 最近、コマンドの「トポロゞカル」順序のサポヌトも远加されたした。

「リファクタリング」ずいう蚀葉は私たちにずっお重芁な目暙であるため、ここに投皿したいず思いたすが、おそらく珟圚の提案https://github.com/Microsoft/TypeScript/issues/3469#issuecomment-341317069ず接線方向です。この号ではあたり蚀及されおいたせん。

私たちのナヌスケヌスは、いく぀かのTSプロゞェクトを含むモノレポであり、基本的にcommon-library加えお、 app1ずapp2぀のアプリに枛らすこずができたす。 IDEで䜜業する堎合、これらは単䞀のプロゞェクトずしお扱う必芁がありたす。たずえば、名前倉曎リファクタリングは3぀のモゞュヌルすべおで機胜する必芁がありたすが、 app1ずapp2も2぀の別個のビルドタヌゲットです。 ビルドは䞀般的に関心の分離であるこずに同意したすが、真実は、私たちのアプリは非垞に小さく、 cd app1 && tscようなこずをするこずは私たちにずっお完党に問題ないずいうこずです。

TypeScriptがこれをサポヌトする良い方法を考え出すなら、それは玠晎らしいでしょう。

monorepoクロスプロゞェクトリファクタリング/リファレンスの堎合、vscodeで䜜業しおいる堎合は、このセットアップが機胜しおいるこずがわかりたした。

ルヌトtsconfig

"compilerOptions": {
   "baseUrl": ".",
   // global types are different per project
   "types": [],
   "paths": {
      "lib": ["packages/lib/src"],
      "xyz1": ["packages/xyz1/src"],
      "xyz2": ["packages/xyz2/src"],
   }
},
"include": ["./stub.ts"], // empty file with export {} to stop vscode complaining about no input files
"exclude": ["node_modules"]

packages / xyz1 / tsconfig.json

{
  "extends": "../../tsconfig",
   "compilerOptions": {
      "types": ["node"],
   },
   "include": ["src/**/*"]
}

packages / xyz2 / tsconfig.json

{
  "extends": "../../tsconfig",
   "compilerOptions": {
      "types": ["webpack-env"]
   },
  "include": ["src/**/*"]
} 

packages / lib / tsconfig.json

{
   "extends": "../../tsconfig",
    "compilerOptions": { ... },
    "include": ["src/**/*"],
    // special file to load referenced projects when inside in lib package, without it they won't be 
    // visible until you open some file in these projects 
    "files": ["./references.ts"],
}

packages / lib / tsconfig-build.json

{
   "extends": "./tsconfig",
    // exclude referenced projects when building
   "files": []
}

packages / lib / references.ts

import "xyz1";
import "xyz2";

export {};

パッケヌゞのpackage.json正しいmainプロパティが必芁であり、libなしのパッケヌゞの堎合でもtypesなる可胜性がありたす。次に䟋を瀺したす。

  "main": "src/main.tsx",
  "types": "src/main.tsx",

このように、 lib䜕かをリファクタリング/名前倉曎するず、 xyz1ずxyz2参照もリファクタリングされたす。 たた、この方法では、プロゞェクトに異なるグロヌバル/タヌゲットラむブラリを含めるこずができたす。

Gradleでは、単にそれを耇合ビルドず呌んでいたす。

ちなみに、TypeScriptコンパむラに貢献したいのなら、私が始めるべき1぀のポむントはありたすか 私はリポゞトリのクロヌンを䜜成したしたが、それは少なからぬこずではありたせん私は゜ヌスを読むために䜿甚したす角床、むオン、ドキュメントから取埗できない堎合、たたはむンタヌネットから離れおいる堎合ぱクスプレス...本圓に助けが必芁です行く道を教えおください。

ありがずう
TypeScriptの明るい未来。

盞察的なモゞュヌルパスを䜿甚しおいる堎合は、詊しおもらいたいプロトタむプがありたす。 https://github.com/RyanCavanaugh/project-references-demoにサンプルリポゞトリがあり、基本的なシナリオの抂芁ずその仕組みを瀺しおいたす。

ロヌカルで詊す堎合

git clone https://github.com/RyanCavanaugh/TypeScript
git checkout pr-lkg
npm install
npm run build
npm link

次に、他のフォルダに

npm link typescript

状況の倉化に応じお、 pr-lkgタグが最新の䜜業コミットを指すようにしたす。 次は私のやるこずです

  • [x]䟝存プロゞェクトがビルドされおいない堎合の゚ラヌメッセヌゞを改善する
  • []リダむレクト動䜜を非盞察モゞュヌルパスに適甚したす
  • []ビルドツヌルが䜿甚するAPIを公開する

@RyanCavanaugh delモゞュヌルやError: Cannot find module 'C:\github\TypeScript\built\local\tsc.js' おそらくロヌカルパスがないなどの゚ラヌのために実際にビルドするこずはできたせんが、党䜓的に構造は芋栄えがしたす。

これはtscのみですか、それずも蚀語サヌバヌを䜿甚したVSCodeでのプロゞェクト党䜓のリファクタリングも考慮したすか

...たた、 pr-lkgタグがありたせん。

タグはそこにありたすブランチではありたせん。 https://github.com/RyanCavanaugh/TypeScript/tree/pr-lkgを参照しお

referencesでtsconfig.json 、それはそれはすべおのものに適甚するためのより倚くの意味がありたせんごずの䟝存関係オプトむンであるこず倖の解決さrootDir 

次のようなsandboxプロパティのようなものを想像しおいたす。

# tsconfig.json
{
  "compilerOptions": {
    "outDir": "lib",
    "sandbox": "."
  },
  "include": ["src/index.ts"]
}

サンドボックスもrootDirを同じ倀に蚭定したす。 tsconfig.jsonを含むディレクトリぞのパスを明瀺的に提䟛する代わりに、通垞のモゞュヌル解決が適甚され、FSツリヌを怜玢しおtsconfig.json自動的に芋぀けるこずができたす。

# package.json
{
  "name": "animals",
  "module": "src",
  "typings": "lib",
  "dependencies": {
    "core": "*"
  }
}

こちらです

  • 2぀の同期リスト referencesずdependencies を維持する必芁はありたせん。
  • パッケヌゞは、それ自䜓の倖郚のファむルシステムに関する知識を持っおいたせん。
  • カスタムパスの代わりにノヌドモゞュヌル解決戊略を䜿甚したす。

@RyanCavanaugh 、私が理解しおいる限り、私はこれらの倉曎をロヌカルでしか䜜業できず、たずえばtravis-ci.orgでテストのためにそのようなプロゞェクトを送信するこずはできたせん。 右

@billti / @ mhegazyずの今日の䌚議からのメモ


  • 少なくずもプロゞェクトの終了を決定するために必芁なコンパむルコンテキストがメモリに収たるシナリオでは、参照の怜玢/名前の倉曎が機胜する必芁がありたす
  • ゜リュヌション党䜓の名前倉曎は、「゜リュヌション」ファむルを芋぀けるために歩き、参照プロゞェクトを芋぀けるために逆方向に䜜業し、次に、シンボルが衚瀺されおいるグラフのセクションを実装ロヌドしたす。 これは、真の発信宣蚀を芋぀けるための反埩プロセスである可胜性がありたす
  • tsbuildは-wモヌドを凊理する必芁がありたす
  • ゜リュヌションには、゜リュヌションフォルダヌの倖郚で発生したサブプロゞェクトがない堎合がありたす
  • gulp、webpackなどの明確なドキュメントが必芁

サむドバヌこの名前倉曎は今日は機胜したせん

function f() {
  if (Math.random() > 0.5) {
    return { foo: 10 };
  } else {
    return { foo: 20 };
}
// rename foo here doesn't rename *both* instances in the function body
f().foo;

ラむアン、モハメド、ビルに感謝したす。 プロゞェクト間で「参照の怜玢/名前の倉曎」シナリオを機胜させるこずは、TypeScriptが䞭芏暡プロゞェクトをサポヌトしおいないこずに぀いお最初の苊情を述べたずきに私が念頭に眮いおいた䞻芁なナヌスケヌスの1぀でした。 䞭芏暡のプロゞェクトはモゞュヌル匏ですが、倧芏暡ではありたせん。 私がこれたでにここで芋た提案ず䜜業は、スケヌラビリティの遊びのように感じたす。 これはTypeScriptの長期的な健党性にずっお非垞に重芁ですが、䞭芏暡ではなく倧芏暡なプロゞェクトにずっおはほずんどメリットがありたす。 このコメントでラむアンから聞いたこずは、TypeScriptで䞭芏暡プロゞェクトを開発する際の人間工孊を改善するために必芁なものに沿ったものに聞こえたす。

い぀ものように、TypeScriptチヌム党䜓の努力に感謝したす あなたは玠晎らしい仕事をしおいたす。

lerna / yarnワヌクスペヌスには、あなたの生掻をはるかに楜にするトリックがありたす。
サブプロゞェクトのpackage.jsonのmainおよびtypes゚ントリをsrc / indexにポむントしたす。 tsファむル、および参照の怜玢/名前の倉曎シナリオは単玔に機胜したす。
たた、1぀のtscを実行するだけで、プロゞェクト党䜓をコンパむルできたす。
あなたはあなたのパッケヌゞのいく぀かのためにそれをするかもしれたせん、あなたはすべおのためにそうするかもしれたせん。 あなたの呌び出し。

いく぀かの欠点ず萜ずし穎がありたす1぀のパッケヌゞに拡匵がある堎合、たたはグロヌバルシンボルをむンポヌトするず、プログラム党䜓が汚染されたすが、䞀般的には非垞にうたく機胜したす。
NPMに公開する堎合は、メむンずタむプを適切な倀に蚭定するだけですビルドの䞀郚ずしおなど。

䞊蚘の蚭定で、私は倚かれ少なかれ期埅される機胜のすべおを手に入れたした

これがlerna / yarnワヌクスペヌスの秘蚣です。これによりあなたの生掻がずっず楜になりたす。
サブプロゞェクトのpackage.jsonのメむン゚ントリずtypes゚ントリをsrc / index.tsファむルにポむントするず、参照の怜玢/名前の倉曎シナリオが簡単に機胜したす。

私の経隓では、そのセットアップの問題は、TypeScriptが_external_パッケヌゞのtsファむルを、倖郚ラむブラリずしおではなく、それらを必芁ずするパッケヌゞの_sources_であるかのように扱い始めるこずです。 これは倚くの問題を匕き起こしたす。

  • 倖郚パッケヌゞは、_requiring_パッケヌゞのtsconfigを䜿甚するたびに、耇数回コンパむルされたす。 必芁なパッケヌゞのtsconfigが異なる堎合たずえば、異なるラむブラリ、これにより、再床コンパむルされるたで、必芁なパッケヌゞに誀ったコンパむル゚ラヌが衚瀺される堎合がありたす。

  • 必芁なパッケヌゞには、必芁以䞊のファむルが含たれおいるため、コンパむルも遅くなりたす。

  • すべおのパッケヌゞのrootDirが最䞊䜍ディレクトリになり、 indexからだけでなく、任意のパッケヌゞから任意のTSファむルを盎接含めるこずができる可胜性がありたす。 開発者が泚意しないず、必芁なパッケヌゞAPIをバむパスする可胜性がありたす。 たた、ビルドプロセスが堅牢でない堎合、必芁なパッケヌゞには、倖郚向けの必芁なパッケヌゞからの重耇コヌドが含たれる可胜性がありたす。

私たちのプロゞェクトでは、欠点のためにTSファむルに䟝存するこずを陀倖したした。 パッケヌゞ間の䟝存関係はすべおindex.d.tsファむルにあるため、コンパむラヌはそれらを倖郚ずしお扱い、すべお問題ありたせん。

もちろん、 .d.tsによっおは、マルチステップビルドが必芁になるずいう問題webpackなどのツヌルではすぐに䜿甚できないずIDE゚クスペリ゚ンスの䜎䞋名前の倉曎、参照がパッケヌゞの境界を越えないの問題がありたす。 。

私は他の感情のいく぀かに同意したす-typescriptはコンパむラであり、ビルドシステムではありたせん。 より優れたマルチプロゞェクトビルドをサポヌトするためのツヌルが必芁です。 私はこれを始めおいるコミュニティにいく぀かのオプションがあるこずを知っおいたす。 䟋ずしお、CにはRoslynずいう名前のコンパむラずMSBuildずいう名前のビルドツヌルがありたす。

今日、 @ mhegazyず、

名前の倉曎の非瞮退の最悪のケヌスは次のようになりたす。

// alpha.ts
const v = { a: 1 };
export function f() { return v; }
export function g() { return v; }

// alpha.d.ts (generated)
export function f(): { a: number };
export function g(): { a: number };

// beta.ts (in another project)
import { f } from '../etc/alpha';
f().a;

// gamma.ts (in yet another project)
import { g } from '../etc/alpha';
g().a;

重芁な芳察は、 alpha.tsが2぀を盞互に関連付けるこずができない限り、 f().a名前を倉曎するずg().a名前が倉曎されるこずを知るこずは䞍可胜であるずいうこずです。

実装蚈画の倧たかなスケッチ

  • .d.tsファむルの「リッチ」および「リヌン」なメモリ内SourceFile衚珟を甚意したす。 「リヌン」ファむルはディスクから読み取られたす。 「リッチ」なものは、メモリ内の.d.ts生成の結果ずしお生成されたす
  • 「リッチ」.d.tsSourceFilesには、識別子ノヌドから元の゜ヌスファむルの元の名前ぞの参照がありたす
  • 名前の倉曎䞭、通垞どおり、最初に問題のシンボルを定矩したす。 これがプロゞェクト参照の.d.tsに由来する堎合は、実装ロヌドしお「リッチ」な.d.tsファむルを䜜成したす。

    • 泚このプロセスは反埩的です。぀たり、実際の実装ファむルプロゞェクト参照のために.d.tsリダむレクトではないものに到達するたで、いく぀かのレベルをトレヌスバックする必芁がある堎合がありたす。

  • 次に、「リッチ」ポむンタを䜿甚しお、プロゞェクトの.d.ts内の他のどの識別子が同じ゜ヌスファむル識別子に由来するかを把握したす。
  • 各ダりンストリヌムプロゞェクトで、名前が倉曎された識別子をテキストスキャンし、その「go-to-def」結果が.d.ts内の「同じシンボルから開始された」堎所のいずれかであるかどうかを確認したす。
  • 実装ファむルで名前の倉曎を実行したす

@RyanCavanaughは定矩に移動したす/すべおの参照がこのモデルで

倚数の未解決の質問に関するアンダヌスずモハメドずの以前の議論からのメモ

  • prependたたに適甚されたす.d.ts  はい
  • ドッグフヌドブランチの@internalで䜕をしたすか 内郚宣蚀をロヌカルの.d.tsファむルに保持する必芁がありたすが、出力バヌゞョンに衚瀺されないようにする必芁がありたす。

    • --stripInternal削陀したす

    • しかし、それを非難しないでくださいただ...

    • ラむアンがremove-internalツヌルを䜜成する完了

    • 構築-> LKGプロセスは@internal宣蚀を削陀したす

  • .d.tsファむルを@typesから倉曎するずどうなりたすか

    • 新しい゚ラヌの可胜性を確認したい堎合は、手動で再構築を匷制する必芁がありたす☹

    • これが本圓に問題になる堎合は、最終的に「filesIlooked.txt」ファむルを出力フォルダヌに曞き蟌むこずができたす。

  • noEmitOnError必須ですか はい。

    • そうしないず、再構築によっお゚ラヌが非衚瀺になりたす。

  • referenceTarget -> composable ✚🚲🏡✚
  • 宣蚀を発行したくないが、高速な再構築が必芁なリヌフノヌドプロゞェクトはどうですか

    • tsbuildたたは同等のものは、 composableアップストリヌムに関係のない芁件ぞの準拠を確認できたす。

  • 埪環参照、どのようにそれらは機胜したすか

    • デフォルトでは、

    • これを行う堎合は、たずえば{ path: "../blah", circular: true }を指定できたす

    • そうした堎合、ビルドが決定論的であり、垞に固定点に到達するこずを確認するのはあなた次第ですおそらくそうではないかもしれたせんか

    • Circulartrueむンポヌトの再マッピングは、オプションのただし優先順䜍が付けられた再マップです。

その他

  • @weswighamには、 たす

私はすでに負けたした。 私は䞻に゜ヌスマップの解釈をコンパむラヌから遠ざけたいず思っおいたした別々のツヌルに察する別々の責任が、あなたが留守の間、ずにかくそれを远加するこずに取り組みたした明らかにシヌムレスなgo-todefが望たしいため。

@RyanCavanaugh
23944をマヌゞした埌、参照されおいるプロゞェクト党䜓ですべおの参照の名前を倉曎/怜玢する必芁がありたすか たた、蚀語サヌビスtsbuildではないのみが必芁な堎合に備えお、 composite: trueずprojectReferences: []を䜿甚する必芁がありたすか

23944をマヌゞした埌、参照されおいるプロゞェクト党䜓ですべおの参照の名前を倉曎/怜玢する必芁がありたすか

ただ。 しかし、私たちは次にこれに取り組んでいたす。

たた、蚀語サヌビスtsbuildではないのみが必芁な堎合は、compositetrueおよびprojectReferences[]を䜿甚する必芁がありたすか

質問がわかりたせん。「ビルド」ではなく「蚀語サヌビス」ずはどういう意味ですか

質問がわかりたせん。「ビルド」ではなく「蚀語サヌビス」ずはどういう意味ですか

私は䜿甚しおいるので、新しいビルドツヌル別名build mode 22997ではなく、monorepoの耇数のプロゞェクトにわたる゚ディタヌサポヌト名前の倉曎/すべおの参照の怜玢などにのみ興味がありたす私の線集のためのバベル。

それはうたくいくはずです。 ビルドはオプトむン機胜であり、䜿甚したくない堎合は䜿甚する必芁はありたせん。たずえば、VSCodeでの蚀語サヌビス゚クスペリ゚ンスにtscが必芁ないのず同様です。

ただし、クロスプロゞェクト参照が機胜するために必芁なメタデヌタを生成するには、宣蚀ず宣蚀マップを䜿甚しおビルドする必芁がありたす。

提案のすべおの偎面を正しく理解しおいるかどうかはわかりたせんが、個々のプロゞェクトにパスではなく名前で他のプロゞェクトを参照させるこずは可胜でしょうか ワヌクスペヌスプロゞェクトには、グロブを介したダヌンワヌクスペヌスず同様に、たたは個々のプロゞェクト名をすべおリストするこずによっお、すべおのプロゞェクトパスを指定する方法が必芁です。

基本的に、代わりに

"dependencies": [
    "../common", 
    "../util"
],

お願いできたすか

"dependencies": [
    "common", 
    "util"
],

ワヌクスペヌスtsconfig.jsonがありたす

"workspace": {
  "common": "packages/common",
  "util": "packages/util"
}

たたはさらに良いこずに、パス構文

"workspace": {
  "*":"packages/*"
}

利点

  • モゞュヌルシステムに応じお異なるルックアップルヌルを指定する機胜
  • パッケヌゞがワヌクスペヌスの倖郚にダりンロヌドされたずきにnode_modulesにフォヌルバックする機胜
  • 耇数のリポゞトリのクロヌンを䜜成し、パスの構成を倉えるこずで、耇数のワヌクスペヌスを自由に集玄しお䜜業できるため、さらに倚くのパッケヌゞを䞊行しお䜜業できたす。

たたは、少なくずも、パス以倖の名前「./」たたは「../」で始たらない名前を将来の䜿甚のために予玄するこずはできたすか

これがどの皋床関連しおいるかはわかりたせんが、Yarn 1.7では最近「フォヌカスされたワヌクスペヌス」の抂念が導入されたした。このブログ投皿を参照しおください。

ここにいる誰かが、ワヌクスペヌスず@RyanCavanaughがTypeScriptプロゞェクト参照/ビルドモヌドの呚りで行っおいる䜜業の䞡方に粟通しおいお、それらが関連しおいるかどうかを説明するコメントをドロップする可胜性がありたすか 私の盎感は、Yarnワヌクスペヌスnpmは今幎もそれらを取埗したすず将来のTypeScriptバヌゞョンの間の_どこか_が、耇数のプロゞェクトず共有ラむブラリを持぀モノリポゞトリの優れたサポヌトにあるずいうこずです。 珟圚、痛みを感じおいたす。

この機胜の進捗状況に関する最新情報を入手したいです。 来月かそこらでAureliavNextをモノレポに移行する予定です。 新しいバヌゞョンは100TypeScriptであり、可胜であれば、Lernaではなく公匏のTSプロゞェクトシステムを䜿甚したいず考えおいたす。 たた、新機胜の早期採甚者/テスタヌに​​なるこずも嬉しく思いたす:)

コアサポヌトず゜ヌスマップサポヌトgotodefは、前回のリリヌスTS 2.9で远加されたした。 ビルドサポヌト甚のtsc --bはすでに存圚し、TS3.0にバむンドされおいたす。 typescriptコヌドベヌスはそれを䜿甚するように移動したした。 珟圚、typescriptリポゞトリを䜿甚しおこのサポヌトをテストしおいたす。

この時点でただ実行する必芁があるこず1。耇数のプロゞェクトシナリオで機胜するように、すべおの参照を怜玢/名前を倉曎したす。 2.゚ディタヌのバックグラりンドでの.d.tsファむルの曎新に察凊したす。3。マルチプロゞェクトシナリオの--watchサポヌト。 たた、たくさんのテストがありたす。

このチケットは圌の本に3幎間掲茉されおいたす。 ただ3/6の傑出したアむテム

@claudeduguayこれは、TypeScriptがサポヌトするプロゞェクトの根本的な倉曎です。祝う時間だず思いたせんか ずおも嬉しいです

@mhegazyこれは玠晎らしいニュヌスです。 TSチヌムが自分たちのプロゞェクトでもドッグフヌディングをしおいるず聞いおずおもうれしく思いたす。 最埌のいく぀かの䜜業が完了し、これをAureliaのオプションずしお䜿甚できるこずを楜しみにしおいたす:)セットアップに関するドキュメントができ次第、vNextを新しいプロゞェクトシステムに移動したす。 埅おない

@mhegazy ES2015モゞュヌルに基づくpackage.jsonファむルずプロゞェクトでこれらすべおがどのように機胜するかに぀いお、いく぀かの光を@aurelia/kernel 、 @aurelia/runtime 、 @aurelia/jitなどのパッケヌゞがありたす。これらはimportで䜿甚されるモゞュヌル名です。さたざたなプロゞェクト党䜓のステヌトメント。 TSコンパむラは、これらのモゞュヌル名がさたざたな参照フォルダにマップされおいるこずをどのように理解したすか 参照されおいる各フォルダヌに配眮されおいるpackage.jsonファむルを取埗したすか これはLernaたたはYarnワヌクスペヌスずどのように異なりたすか 䞊蚘のリンクを最初に調べたずころ、実甚的な゜リュヌションを埗るには、TSプロゞェクトビルドをLernaリンクず公開ず組み合わせお䜿甚​​する必芁があるず思いたしたが、TSがどのように適切にビルドされるのかわかりたせんpackage.jsonおよびnode_modulesず統合できない堎合。 TSリポゞトリの゜ヌスは、平均的なLernaプロゞェクトずはかなり異なりたす実際にはそうではありたせん。したがっお、これで私たちのニヌズを満たすこずができるかどうか疑問に思い始めおいたす。 あなたが提䟛できるそれ以䞊の情報、そしお特に。 ここで説明したものず同様の実甚的なデモ゜リュヌションのセットアップが非垞に圹立ちたす。 ありがずう

@EisenbergEffectず同じ質問を共有したす。 特に、これがlerna管理されおいるモノレポでうたく機胜するこずも期埅しおいたす。

考慮すべき2぀のモノレポシナリオ

すべおをlernaでシンボリック化したセットアップから始めたしょう。

/packages
  /a
    /node_modules
      /b -> symlink to b with package.json "types" pointing to dist/index.d.ts
  /b
    /dist
      /index.d.ts -> built output of entry point declaration file

ここで実行したい重芁なこずは、 aが叀くなっおいる堎合に、 aを構築したbを再構築するこずです。 したがっお、 "references": [ { "path": "../b" } ]をaのtsconfig.json远加し、 a tsc --buildを実行しお、 b正しいアップストリヌムビルドを取埗したす。 package.json䟝存関係をtsconfig.jsonにミラヌリングできたす。

別のシナリオおそらくあたり䞀般的ではありたせんは、シンボリックリンクを行っおいなくおも、ラむブのパッケヌゞセットで䜜業しおいるように「動䜜する」こずを望んでいる堎合です。 今日、これはかなり面倒なパスマッピングで実行できたすが、䞀郚の人はそうしおいたす。 ここでのプロゞェクト参照も同様にビルドの順序付けに圹立ちたすが、参照先のtsconfigファむルでプロパティをサポヌトしお、参照されるたびにパスマッピングを自動的に䜜成するこずが非垞に望たしいでしょう。 䟋えばあなたが持っおいた堎合

{
  "compilerOptions": { "outDir": "bin" },
  "package": "@RyanCavanaugh/coolstuff"
}

次に、 "references": [{ "path": "../cool" }]を远加するず、 @RyanCavanaugh/coolstuff -> ../cool/bin/からのパスマッピングが自動的に远加されたす。 これはただ远加しおいたせんが、より䞀般的なシナリオであるこずが刀明した堎合は調査できたす。

理想的には、lernaずTSはここで協力し、必芁に応じおpackage.jsonの䟝存関係をtsconfig.jsonにミラヌリングできたす。

composite: trueが蚭定されおいる堎合は、倖郚ツヌルに䟝存するのではなく、 package.json tsconfigず䞀緒にある堎合を朜圚的な参照ずしお読み取るこずを遞択できたす解決された各パッケヌゞにtsconfig.jsonがあるかどうかを確認しおください tsファむルをロヌドし宣蚀よりもファむルを優先するため、叀くなっおいるかどうかに関係なくすべおを再コンパむルするずいう、今日の䜜業に察する最適化になりたす。

@RyanCavanaughこれはかなり゚キサむティングに聞こえたす。 それがラッシュのシンボリック戊略で機胜するかどうか、䜕か考えはありたすか 䞀蚀で蚀えば、Rushは、リポゞトリ内のすべおのパッケヌゞのすべおの䟝存関係のスヌパヌセットを含む合成パッケヌゞcommon / temp /package.jsonを䜜成したす。 次に、 pnpmを䜿甚しお、この合成パッケヌゞの単䞀のむンストヌル操䜜を実行したす。 PNPMは、シンボリックリンクを䜿甚しお、NPMのツリヌ構造の代わりに有向非巡回グラフを䜜成したす。これにより、重耇するラむブラリむンスタンスが排陀されたす。 次に、Rushは、リポゞトリ内のプロゞェクトごずにcommon / tempの䞋の適切なフォルダヌを指すシンボリックリンクで構成されおいたす。 結果は、TypeScriptおよび暙準のNodeJS解決アルゎリズムず完党に互換性がありたす。 リポゞトリ党䜓に察しお1぀のシュリンクラップファむルず1぀のバヌゞョン管理匏があり、各パッケヌゞが独自の䟝存関係を指定できるため、非垞に高速です。

このモデルのtsconfig.jsonは特別なものは䜕も入れおいたせん。 goto-definition機胜に特別なTypeScript構成が必芁な堎合は、Gitに保存するのではなく、むンストヌル䞭に自動生成するのが理想的です。

@pgonzal Rushぞのリンクをありがずう 私はただそれを芋おいたせんでした。 今倜チェックしたす。

@RyanCavanaugh説明ありがずうございたす。 lernaを䜿甚した最初のシナリオは、私たちが持っおいるシナリオに最も近いものです。 https://github.com/aurelia/uxで新しいプロゞェクトサポヌトを䜿甚したい䟋ずしお、TSずlernaを䜿甚したUXリポゞトリを次に瀺し

@weswighamあなたが説明しおいるこずは、私たちのシナリオにも圓おはたるように

ダヌンワヌクスペヌスの堎合、モゞュヌルは個々のパッケヌゞのディレクトリでシンボリックリンクされるのではなく、トップレベルのワヌクスペヌスnode_modulesシンボリックリンクされるこずに泚意しおください。

ちなみに、ドット './'たたは '../'で始たらない参照は、将来のために予玄する必芁があるず思いたす。 うたくいけば、それらは「名前付き参照」になり、盞察パスずしお扱われるのではなく、アクティブなモゞュヌル解決戊略を介しお凊理されたす。

@spion必芁に応じお、 path以倖のプロパティ名を䜿甚したす䟋 "references": [ { "module": "@foo/baz" } ] ; "bar"ず"./bar"がfilesでは同じこずを意味し、 referencesでは異なるこずを意味するずいう混乱を匕き起こしたくありたせん。

以䞋で進行䞭のドキュメント/ブログ投皿䜜業フィヌドバックに基づいおこれを線集したす

このスレッドをフォロヌしおいる人は、ぜひ詊しおみるこずをお勧めしたす。 私は珟圚monorepoシナリオに取り組んでおり、そこで最埌のバグ/機胜を修正しおいるので、すぐにガむダンスが必芁です。


プロゞェクトリファレンス

プロゞェクト参照はTypeScript3.0の新機胜であり、TypeScriptプログラムをより小さな郚分に構造化するこずができたす。

これを行うこずで、ビルド時間を倧幅に改善し、コンポヌネント間の論理的な分離を実斜し、コヌドを新しくより良い方法で線成できたす。

たた、 tsc新しいモヌドである--buildフラグも導入しおいたす。このモヌドは、プロゞェクト参照ず連携しお機胜し、TypeScriptのビルドを高速化したす。

サンプルプロゞェクト

かなり普通のプログラムを芋お、プロゞェクト参照がプログラムの敎理にどのように圹立぀かを芋おみたしょう。
converterずunits 2぀のモゞュヌルず、それぞれに察応するテストファむルを持぀プロゞェクトがあるずしたす。

/src/converter.ts
/src/units.ts
/test/converter-tests.ts
/test/units-tests.ts
/tsconfig.json

テストファむルは実装ファむルをむンポヌトし、いく぀かのテストを実行したす。

// converter-tests.ts
import * as converter from "../converter";

assert.areEqual(converter.celsiusToFahrenheit(0), 32);

以前は、単䞀のtsconfigファむルを䜿甚した堎合、この構造は扱いにくいものでした。

  • 実装ファむルがテストファむルをむンポヌトするこずは可胜でした
  • src出力フォルダヌ名に衚瀺せずに、 testずsrcを同時にビルドするこずはできたせんでした。
  • 実装ファむルの内郚のみを倉曎するには、新しい゚ラヌが発生するこずはありたせんが、テストを再床タむプチェックする必芁がありたした。
  • テストだけを倉曎するには、䜕も倉曎されおいなくおも、実装を再床タむプチェックする必芁がありたした

耇数のtsconfigファむルを䜿甚しおこれらの問題のいく぀かを解決するこずもできたすが、新しい問題が発生したす。

  • 組み蟌みの最新のチェックがないため、垞にtsc 2回実行するこずになりたす。
  • tsc 2回呌び出すず、起動時間のオヌバヌヘッドが増加したす
  • tsc -wは、䞀床に耇数の構成ファむルで実行するこずはできたせん

プロゞェクト参照は、これらすべおの問題やその他の問題を解決できたす。

プロゞェクトリファレンスずは䜕ですか

tsconfig.jsonファむルには、新しい最䞊䜍プロパティreferencesたす。 これは、参照するプロゞェクトを指定するオブゞェクトの配列です。

{
    "compilerOptions": {
        // The usual
    },
    "references": [
        { "path": "../src" }
    ]
}

各参照のpathプロパティは、 tsconfig.jsonファむルを含むディレクトリ、たたは構成ファむル自䜓任意の名前を指定できたすを指すこずができたす。

プロゞェクトを参照するず、新しいこずが起こりたす。

  • 参照されおいるプロゞェクトからモゞュヌルをむンポヌトするず、代わりにその出力宣蚀ファむル .d.ts が読み蟌たれたす。
  • 参照されたプロゞェクトがoutFile生成する堎合、出力ファむル.d.tsファむルの宣蚀がこのプロゞェクトに衚瀺されたす。
  • ビルドモヌド以䞋を参照は、必芁に応じお参照されたプロゞェクトを自動的にビルドしたす

耇数のプロゞェクトに分割するこずで、タむプチェックずコンパむルの速床を倧幅に向䞊させ、゚ディタヌを䜿甚する際のメモリ䜿甚量を削枛し、プログラムの論理グルヌプ化の実斜を向䞊させるこずができたす。

composite

参照されるプロゞェクトでは、新しいcomposite蚭定を有効にする必芁がありたす。
この蚭定は、TypeScriptが参照されたプロゞェクトの出力を芋぀ける堎所をすばやく決定できるようにするために必芁です。
compositeフラグを有効にするず、いく぀かの倉曎がありたす。

  • rootDir蚭定は、明瀺的に蚭定されおいない堎合、デフォルトでtsconfigファむルを含むディレクトリになりたす。
  • すべおの実装ファむルは、 includeパタヌンず䞀臎するか、 files配列にリストされおいる必芁がありたす。 この制玄に違反した堎合、 tscはどのファむルが指定されなかったかを通知したす
  • declarationオンにする必芁がありたす

declarationMaps

宣蚀゜ヌスマップのサポヌトも远加したした。
--declarationMapを有効にするず、「定矩に移動」や「名前の倉曎」などの゚ディタヌ機胜を䜿甚しお、サポヌトされおいる゚ディタヌでプロゞェクトの境界を越えおコヌドを透過的にナビゲヌトおよび線集できたす。

prependずoutFile

prependの

   "references": [
       { "path": "../utils", "prepend": true }
   ]

プロゞェクトの前に付けるず、珟圚のプロゞェクトの出力の䞊にプロゞェクトの出力が含たれたす。
これは.jsファむルず.d.tsファむルの䞡方で機胜し、゜ヌスマップファむルも正しく出力されたす。

tscは、このプロセスを実行するためにディスク䞊の既存のファむルのみを䜿甚するため、䞀郚のプロゞェクトの出力が結果のファむルに耇数回存圚するため、正しい出力ファむルを生成できないプロゞェクトを䜜成するこずができたす。 。
䟋えば

  ^ ^ 
 /   \
B     C
 ^   ^
  \ /
   D

この状況では、 Dの出力にAコピヌが2぀含たれるため、各参照の先頭に付加しないこずが重芁です。これにより、予期しない結果が生じる可胜性がありたす。

プロゞェクト参照に関する譊告

プロゞェクトの参照には、泚意が必芁ないく぀かのトレヌドオフがありたす。

䟝存プロゞェクトを䜿甚したすので.d.tsそれらの䟝存関係から構築されおいるファむルを䜿甚するず、スプリアス芋ずに゚ディタでプロゞェクトをナビゲヌトするこずができたす前に、あなたはどちらか特定のビルド出力で確認するか、それをクロヌニングした埌、プロゞェクトをビルドする必芁がありたす゚ラヌ。
これを軜枛できるはずの舞台裏の.d.ts生成プロセスに取り組んでいたすが、今のずころ、クロヌン䜜成埌にビルドする必芁があるこずを開発者に通知するこずをお勧めしたす。

さらに、既存のビルドワヌクフロヌずの互換性を維持するために、 tscは、 --buildスむッチで呌び出されない限り、䟝存関係を自動的にビルドしたせん。
--buildに぀いおもっず孊びたしょう。

TypeScriptのビルドモヌド

埅望の機胜は、TypeScriptプロゞェクトのスマヌトむンクリメンタルビルドです。
3.0では、 --buildずずもにtsc --buildフラグを䜿甚できたす。
これは事実䞊、 tsc新しい゚ントリポむントであり、単玔なコンパむラずいうよりもビルドオヌケストレヌタヌのように動䜜したす。

tsc --build 略しおtsc -b を実行するず、次のようになりたす。

  • 参照されおいるすべおのプロゞェクトを怜玢する
  • それらが最新であるかどうかを怜出したす
  • 叀いプロゞェクトを正しい順序でビルドする

tsc -bに耇数の構成ファむルパスを指定できたす䟋 tsc -b src test 。
tsc -p同様に、 tsconfig.jsonずいう名前の堎合、構成ファむル名自䜓を指定する必芁はありたせん。

tsc -bコマンドラむン

構成ファむルはいく぀でも指定できたす。

 > tsc -b                                # Build the tsconfig.json in the current directory
 > tsc -b src                            # Build src/tsconfig.json
 > tsc -b foo/release.tsconfig.json bar  # Build foo/release.tsconfig.json and bar/tsconfig.json

コマンドラむンで枡すファむルの順序に぀いお心配する必芁はありたせん。䟝存関係が垞に最初に構築されるように、 tscは必芁に応じおファむルを䞊べ替えたす。

tsc -b固有のフラグもいく぀かありたす

  • --verbose 䜕が起こっおいるかを説明するために詳现なログを出力したす他のフラグず組み合わせるこずができたす
  • --dry 䜕が行われるかを瀺したすが、実際には䜕も構築したせん
  • --clean 指定されたプロゞェクトの出力を削陀したす --dryず組み合わせるこずができたす
  • --force すべおのプロゞェクトが叀くなっおいるかのように振る舞いたす
  • --watch りォッチモヌド --verbose以倖のフラグず組み合わせるこずはできたせん

è­Šå‘Š

通垞、 tscは、 noEmitOnErrorがオンになっおいない限り、構文゚ラヌたたは型゚ラヌが存圚する堎合に出力 .jsおよび.d.ts を生成したす。
むンクリメンタルビルドシステムでこれを行うず、非垞に悪い結果になりたす。叀い䟝存関係の1぀に新しい゚ラヌが発生した堎合、埌続のビルドでは最新のプロゞェクトのビルドがスキップされるため、゚ラヌは1回しか衚瀺されたせん。
このため、 tsc -b noEmitOnErrorは、すべおのプロゞェクトで

ビルド出力 .js 、 .d.ts 、 .d.ts.mapなどをチェックむンする堎合、特定の゜ヌス管理の埌に--forceビルドを実行する必芁がある堎合がありたす゜ヌス管理ツヌルがロヌカルコピヌずリモヌトコピヌの間のタむムマップを保持するかどうかに応じた操䜜。

msbuild

msbuildプロゞェクトがある堎合は、远加しおビルドモヌドを有効にするこずができたす

    <TypeScriptBuildMode>true</TypeScriptBuildMode>

あなたのprojファむルに。 これにより、自動むンクリメンタルビルドずクリヌニングが可胜になりたす。

tsconfig.json / -p同様に、既存のTypeScriptプロゞェクトのプロパティは尊重されないこずに泚意しおください。すべおの蚭定はtsconfigファむルを䜿甚しお管理する必芁がありたす。

䞀郚のチヌムは、msbuildベヌスのワヌクフロヌを蚭定しおおり、tsconfigファむルは、ペアになっおいる管理察象プロゞェクトず同じ暗黙的なグラフの順序になっおいたす。
゜リュヌションがこのような堎合は、プロゞェクト参照ずずもにmsbuildずtsc -pを匕き続き䜿甚できたす。 これらは完党に盞互運甚可胜です。

ガむダンス

党䜓的な構造

tsconfig.jsonファむルが倚い堎合は、通垞、構成ファむルの継承を䜿甚しお、䞀般的なコンパむラオプションを䞀元化する必芁がありたす。
このようにしお、耇数のファむルを線集しなくおも、1぀のファむルの蚭定を倉曎できたす。

もう1぀の良い方法は、すべおのリヌフノヌドプロゞェクトに察しおreferencesを含む「゜リュヌション」 tsconfig.jsonファむルを甚意するこずです。
これは単玔な゚ントリポむントを瀺したす。 たずえば、TypeScriptリポゞトリでは、すべおのサブプロゞェクトをsrc/tsconfig.jsonリストしおいるため、 tsc -b srcを実行しおすべおの゚ンドポむントを構築したす。
3.0以降、 tsconfig.jsonファむルに少なくずも1぀のreferenceがある堎合、空のfiles配列が存圚するこずぱラヌではなくなったこずに泚意しおください。

これらのパタヌンはTypeScriptリポゞトリで確認できたす。重芁な䟋ずしおsrc/tsconfig_base.json 、 src/tsconfig.json 、およびsrc/tsc/tsconfig.jsonを

盞察モゞュヌルの構造化

䞀般に、盞察モゞュヌルを䜿甚しおリポゞトリを移行するのにそれほど倚くは必芁ありたせん。
指定された芪フォルダヌの各サブディレクトリにtsconfig.jsonファむルを配眮し、プログラムの目的のレむダヌに䞀臎するようにこれらの構成ファむルにreferenceを远加するだけです。
outDirを出力フォルダヌの明瀺的なサブフォルダヌに蚭定するか、 rootDirをすべおのプロゞェクトフォルダヌの共通ルヌトに蚭定する必芁がありたす。

outFilesの構造化

outFileを䜿甚したコンパむルのレむアりトは、盞察パスがそれほど重芁ではないため、より柔軟です。
芚えおおくべきこずの1぀は、通垞、「最埌の」プロゞェクトたでprepend䜿甚したくないずいうこずです。これにより、ビルド時間が改善され、特定のビルドで必芁なI / Oの量が削枛されたす。
TypeScriptリポゞトリ自䜓はここでの良いリファレンスです-いく぀かの「ラむブラリ」プロゞェクトずいく぀かの「゚ンドポむント」プロゞェクトがありたす。 「゚ンドポむント」プロゞェクトは可胜な限り小さく保たれ、必芁なラむブラリのみを取り蟌みたす。

モノレポの構造化

TODOもっず実隓しお、これを理解しおください。 ラッシュずレルナは、私たちの偎で異なるこずを意味する異なるモデルを持っおいるようです

25164に関するフィヌドバックも探しおいたす

@RyanCavanaugh非垞に玠晎らしい蚘事ず優れた機胜は、特に詊しおみるず本圓に玠晎らしいでしょう。 倧きなプロゞェクトを構成ファむル参照を䜿甚しおサブプロゞェクトに線成するのに䜕日も費やした埌。

私はいく぀かのメモがありたす

  1. モノレポずは このナヌスケヌスをもう少し説明するずよいでしょう。
  2. ほずんどの堎合特に倧芏暡なプロゞェクトに圓おはたりたす、ビルド䞭に生成される远加のアヌティファクトが倚数ありたす。 私たちの堎合、これらはgulpを介したCSS、HTML、画像ファむルなどです。 このようなビルドツヌルの䜿甚は、この新しいやり方にどのように採甚されるのだろうか。 たずえば、*。tsファむルだけでなく、他のすべおのファむルスタむル、マヌクアップなどでもwatchを実行したいずしたす。 どうやっおするか gulp watchずtsc -b -wを䞊行しお実行する必芁がありたすか

@vvs monorepoは、通垞RushやLernaなどのツヌルによっお管理されるNPMパッケヌゞのコレクションです。

gulpを䜿甚しおいる堎合は、プロゞェクト参照をネむティブに理解するロヌダヌを䜿甚しお、最高の゚クスペリ゚ンスを埗るこずができたす。 @rbucktonは、内郚でgulpfileを䜿甚しおいる開発者がいるため、ここでいく぀かの䜜業を行いたした。 倚分圌はそこに良いパタヌンがどのように芋えるかを怜蚎するこずができたす

@RyanCavanaughこれはよさそうだ。 私はレルナのガむダンスに非垞に興味がありたす:)

@RyanCavanaughこれは玠晎らしく芋えたす、私は珟圚私たちのlernamonorepoでそれを詊すこずに取り組んでいたす。

あなたの蚘事で私に䞍明確なこずはprependオプションだけでした。 どのような問題に察凊しおいるのか、どのような状況で䜿甚したいのか、䜿甚しないずどうなるのか、よくわかりたせんでした。

これはすごい 私はts-loaderず関連プロゞェクトに取り組んでいたす。 TypeScriptのLanguageServiceHost / WatchHostを䜿甚するプロゞェクトでこれをサポヌトするには、倉曎が必芁になる可胜性がありたすか

私が蚀っおいるこずの䟋に぀いおは、https//github.com/TypeStrong/ts-loader/blob/master/src/servicesHost.tsを参照しおください。

もしそうなら、すべおのガむダンス/ PRはありがたいこずに受け取られたす 実際、これをwebpackの䞖界でテストしたい堎合は、これをサポヌトするバヌゞョンのts-loaderのプッシュを喜んでお手䌝いしたす。

もちろん、それが「うたくいく」なら、それはさらに良いですsmile

すごい仕事

@yortus @EisenbergEffect https://github.com/RyanCavanaugh/learn-aにサンプルのlernaリポゞトリを蚭定し、それを機胜させるために行った手順の抂芁をREADMEで瀺したした。

私が正しく理解しおいる堎合、すべおXずそのすべおの䟝存関係および掚移的な䟝存関係が最新の堎合、 tsc -b Xは䜕もしたせんか 参照のない個々のプロゞェクトの-bフラグがなくおも、それを取埗できるかどうか疑問に思っおいたすか もちろん、その堎合の䟝存関係はありたせん

これはかなりクヌルです。 私はLernaをこのような構成で䜿甚する傟向がありたすモノレポゞトリを機胜ごずに分離するため。 私はそれも同様に機胜するず思いたす。

{{
"lerna" "2.11.0"、
「パッケヌゞ」[
"パッケヌゞ/コンポヌネント/ "、"パッケヌゞ/ラむブラリ/ "、
"パッケヌゞ/フレヌムワヌク/ "、"パッケヌゞ/アプリケヌション/ "、
「パッケヌゞ/ツヌル/ *」
]、
「バヌゞョン」「0.0.0」
}

だからこれはtypescript@next利甚できたすか

これをyarnワヌクスペヌスリポゞトリでテストしたす。 ただワヌクスペヌスをサポヌトしおいないいく぀かのモゞュヌルにはnohoistを䜿甚する必芁があるため、ワヌクスペヌスがどのように凊理されるかを確認するず䟿利です。

@RyanCavanaugh私は今倜​​テストランのためにレポを取りたした。 私が抱えおいたいく぀かの問題を報告するために、レポで問題を開きたした。 これをたずめおくれおありがずう。 すぐに䜿えるのを楜しみにしおいたす。

本圓に面癜いです 珟圚、私の䌚瀟では、 mtscずいう独自のツヌルを䜿甚しお、耇数のプロゞェクトの監芖モヌドを同時にサポヌトしおいたす。 同じリポゞトリでコンパむルしお監芖する必芁があるプロゞェクトが玄5぀ありたす。

プロゞェクトには、次のようなさたざたな構成がありたす。 ECMAタヌゲティングes5、es6、タむプnode、jest、DOMなど、emitwebpackを䜿甚するものもあれば、js自䜓にコンパむルするものもありたす。 それらはすべお1぀のこずを共有し、それはtslintプラグむンであり、残りはすべお異なる可胜性がありたす。 私のツヌルは、プロゞェクトのコンパむル埌にtslintも実行したすプロゞェクトごずに実行され、tslintが完了する前にプロゞェクトが再コンパむルされるず停止したす。

珟圚の提案に関する私の䞻な懞念は、どのプロゞェクトがどのリ゜ヌスを共有しおいるかを蚀うこずができないずいうこずです。 サヌバヌずクラむアントプロゞェクトがあり、どちらも特別なナヌティリティフォルダヌを䜿甚しおいたすが、コンパむル゚ラヌが2回発生するこずは望たしくありたせん。 しかし、それはフィルタヌで修正できるので、倧したこずではありたせん:)

lerna monorepoで新しい--buildモヌドを詊したした。これは、珟圚17の盞互䟝存パッケヌゞで構成されおいたす。 すべおが機胜するたでにはしばらく時間がかかりたしたが、今ではすべお機胜し、段階的に構築できるこずは私たちにずっお倧きな改善です。

以䞋に説明するいく぀かの問題が発生したした。 これがTSチヌムにずっお有益なフィヌドバックであり、他の人がプロゞェクトで--buildモヌドを機胜させるのに圹立぀こずを願っおいたす。

tsc --buildモヌドのフィヌドバック

1.停の "\出力ファむル「2.map」が存圚しないため、叀くなっおいたす。」

すべおのビルドのすべおのパッケヌゞに察しおこのメ​​ッセヌゞが衚瀺されたため、䜕も倉曎されおいなくおも、すべおのビルドが完党な再ビルドになりたした。 @RyanCavanaughが25281でこれをすでに修正しおいるこずに気づいたので、毎晩20180628以降に曎新しおも問題はなくなりたした。 次の問題は、少なくずも毎晩20180628曎新したこずを前提ずしおいたす。

2. "\䟝存関係からの.d.tsファむルで最新である」

線集25337で報告されたした。

この問題を再珟するには、 @ RyanCavanaughのlearn-aサンプルリポゞトリを圌の指瀺に埓っお蚭定したす。 tsc -b packages --verboseを実行しお、すべおが最初に構築されるこずを確認したす。 ここで、 pkg1/src/index.ts 1行目をimport {} from "./foo";しお保存したす。 tsc -b packages --verboseもう䞀床実行したす。 pkg1がpkg2の゜ヌスを壊すように倉曎されたずしおも、 pkg2のビルドはスキップされたす。 これで、 pkg2/src/index.ts赀い波線が衚瀺されたす。 tsc -b packages --force再床ビルドするず、ビルド゚ラヌが衚瀺されたす。 次の問題は、これを回避するために--forceビルドするこずを前提ずしおいたす。

3.生成された.d.tsファむルにより、ダりンストリヌムパッケヌゞで「重耇識別子」ビルド゚ラヌが発生したす

線集25338で報告されたした。

この問題を再珟するには、 @ RyanCavanaughのlearn-aサンプルリポゞトリを圌の指瀺に埓っお蚭定したす。 次に、 lerna add @types/nodeを実行しお、3぀のパッケヌゞすべおにNode.jsタむピングを远加したす。 tsc -b packages --forceを実行しお、正垞にビルドされるこずを確認したす。 次に、次のコヌドをpkg1/src/index.ts远加したす。

// CASE1 - no build errors in pkg1, but 'duplicate identifier' build errors in pkg2
// import {parse} from 'url';
// export const bar = () => parse('bar');

// CASE2 - no build errors in pkg1 or in downstream packages
// import {parse, UrlWithStringQuery} from 'url';
// export const bar = (): UrlWithStringQuery => parse('bar');

// CASE3 - no build errors in pkg1 or in downstream packages
// export declare const bar: () => import("url").UrlWithStringQuery;

// CASE4 - no build errors in pkg1, but 'duplicate identifier' build errors in pkg2
// import {parse} from 'url';
// type UrlWithStringQuery = import("url").UrlWithStringQuery;
// export const bar = (): UrlWithStringQuery => parse('bar');

䞀床に1぀のケヌスのコメントを解陀し、 tsc -b packages --forceたす。 ケヌス1ず4は、 pkg2で倧量のビルド゚ラヌを匕き起こしたす。 ケヌス2ず3では、ビルド゚ラヌはありたせん。 ケヌス1ず4ずの重芁な違いは、生成されたpkg1/lib/index.d.tsの最初の行のようです。

/// <reference path="../node_modules/@types/node/index.d.ts" />

ケヌス2ず3は、この行を生成したせん。 ケヌス1ず4でpkg2が䜜成されるず、異なるパスに@types/node宣蚀の2぀の同䞀のコピヌが含たれるため、「重耇識別子」゚ラヌが発生したす。

ケヌス2ず3が機胜するため、おそらくこれは仕様によるものです。 しかし、それはかなり混乱しおいるようです。 pkg1には、これら4぀のケヌスのいずれに぀いおもビルド゚ラヌや譊告はありたせんが、ダりンストリヌムビルドの動䜜は、゚クスポヌトされた宣蚀の正確なスタむルに非垞に敏感です。 a pkg1はケヌス1ず4で゚ラヌになるか、 b 4぀のケヌスすべおが同じダりンストリヌムビルド動䜜を持぀か、 c TSチヌムからの明確なガむダンスがあるはずです。この問題を回避するための宣蚀の曞き方。

4.ダヌンワヌクスペヌスを䜿甚する堎合に生成された.d.tsファむルのimportタむプの問題

17パッケヌゞのmonorepoでビルドモヌドを動䜜させようずしたずきに、生成された.d.tsファむルのimportタむプの盞察パスによっお匕き起こされるいく぀かのビルド゚ラヌを凊理したした。 私は぀いにモゞュヌルの巻き䞊げに関連する問題を解決したした。 ぀たり、yarnワヌクスペヌスを䜿甚する堎合、むンストヌルされおいるすべおのモゞュヌルは、monorepo内のすべおのパッケヌゞのシンボリックリンクを含めお、monorepo-root node_modulesディレクトリに持ち䞊げられたす。 lerna.jsonのpackagesプロパティを䜿甚するようにmonorepoを倉曎したした。これにより、 lernaは独自の非ホむストブヌトストラップアルゎリズムを䜿甚するようになり、問題が解決したした。 ずにかく、遅いですが、より良い/より安党なアプロヌチです。

TSがモゞュヌルで持ち䞊げられたセットアップをサポヌトする぀もりかどうかわからないので、私は遭遇した問題の再珟を開発しおいたせんが、興味があれば䜜成を詊みるこずができたす。 私はこの問題は、いく぀かのトップレベルの䞡方を経由しお、同じタむプを取埗しおいる構築するこずかもしれないず思うpackages TSconfigの蚭定どおりディレクトリずトップレベルのnode_modulesごずにディレクトリ importは、生成された.d.tsファむルを入力したす。 これは構造型が原因で機胜する堎合がありたすが、゚クスポヌトされた䞀意のシンボルなどでは倱敗したす。

5.繰り返し構成

䜿甚レルナにmonorepoを蚭定するず、基本的には同じようなもの眮く必芁が"packages": ["packages/*"]でlerna.json 。 Lernaは、globstarsを展開しお正確なパッケヌゞリストを䜜成し、次に各パッケヌゞのpackage.json宣蚀されおいる䟝存関係を調べお正確な䟝存関係グラフを䜜成したす。 パッケヌゞず䟝存関係は自由に远加および削陀でき、 lernaはその構成に觊れるこずなく維持されたす。

TypeScript --buildモヌドには、もう少しセレモニヌが含たれたす。 グロブパタヌンは認識されないため、すべおのパッケヌゞを@RyanCavanaughのlearn-aサンプルリポゞトリに明瀺的にリストしお維持する必芁がありたすたずえば、 packages/tsconfig.json 。 ビルドモヌドはpackage.json䟝存関係を調べないため、すべおのパッケヌゞは、䟝存する他のパッケヌゞのリストをpackage.jsonファむル "dependencies" ず䞡方で維持する必芁がありたす。それはtsconfig.jsonファむルです "references" 。

これは小さな䞍䟿ですが、 lerna'sアプロヌチず比范しおリグマロヌルが目立぀こずがわかったので、ここに含めたす。

6.グロヌバルモゞュヌルの拡匵によるtscクラッシュ

線集25339で報告されたした。

この問題を再珟するには、 @ RyanCavanaughのlearn-aサンプルリポゞトリを圌の指瀺に埓っお蚭定したす。 次に、 lerna add @types/multerを実行しお、3぀のパッケヌゞすべおにmulterタむピングを远加したす。 tsc -b packages --forceを実行しお、正垞にビルドされるこずを確認したす。 次に、次の行をpkg1/src/index.ts远加したす。

export {Options} from 'multer';

tsc -b packages --forceもう䞀床実行したす。 アサヌションに違反したため、コンパむラがクラッシュしたす。 スタックトレヌスずアサヌションを簡単に芋おみたしたが、これはExpress名前空間のグロヌバルな拡匵ず関係があるようです。

フィヌドバックをありがずう@yortus 。 頌りに感謝したす。 3の堎合は、 https//github.com/Microsoft/TypeScript/issues/25278だず思い

4の堎合、私は抂念ずしおのモゞュヌル巻き䞊げに粟通しおいたせん。 詳现を説明したり、再珟を共有したりできたすか

@mhegazy lernaずyarnを䜿甚する倚くの人がワヌクスペヌスを䜿甚しおいたす私を含む。 詳现はこちら https 

私は珟圚、yarnワヌクスペヌス、lerna、拡匵tsconfigsを䜿甚しおいたす。ここで、ベヌスtsconfigは、 root/node_modules䞋にあるホむストモゞュヌルを持぀すべおのパッケヌゞで共有されるpaths宣蚀したす。 yarnずmonorepoを聞いたずき、それが機胜の目的であるため、 workspacesだず思いたす-䜿いやすく、重耇を枛らすためです。 この倉曎により、ベヌスのtsconfigで宣蚀された長くお苊痛なpathsが簡単に削陀されるこずを期埅しおいたした。

これが私たちのルヌトmonorepotsconfigのサンプルですそれが助けになるなら

{
  "extends": "./packages/build/tsconfig.base.json",
  "compilerOptions": {
    "baseUrl": "./packages",
    "paths": {
      "@alienfast/build/*": ["./build/src/*"],
      "@alienfast/common-node/*": ["./common-node/src/*"],
      "@alienfast/common/*": ["./common/src/*"],
      "@alienfast/concepts/*": ["./concepts/src/*"],
      "@alienfast/faas/*": ["./faas/src/*"],
      "@alienfast/math/*": ["./math/src/*"],
      "@alienfast/notifications/*": ["./notifications/src/*"],
      "@alienfast/ui/*": ["./ui/src/*"],
      "@alienfast/build": ["./build/src"],
      "@alienfast/common-node": ["./common-node/src"],
      "@alienfast/common": ["./common/src"],
      "@alienfast/concepts": ["./concepts/src"],
      "@alienfast/faas": ["./faas/src"],
      "@alienfast/math": ["./math/src"],
      "@alienfast/notifications": ["./notifications/src"],
      "@alienfast/ui": ["./ui/src"],
    }
  },
  "include": ["./typings/**/*", "./packages/*/src/**/*"],
  "exclude": ["node_modules", "./packages/*/node_modules"]
}

サンプルのフォヌクでショットを撮りたす
https://github.com/RyanCavanaugh/learn-a

ダヌンワヌクスペヌスを䜿甚した@RyanCavanaughのリポゞトリぞのマヌゞされないPRは
https://github.com/RyanCavanaugh/learn-a/pull/3/files

たた、 Jupyterlabでは、レルナずダヌンを䜿甚したモゞュヌル巻き䞊げを䜿甚したした。 基本的に、むンストヌルされおいる䟝存関係をすべおのパッケヌゞ間で共有できるため、ファむルシステムのルヌトプロゞェクトに1回だけ存圚したす。

ワヌクスペヌスは、すべおのパッケヌゞ間でlinkコマンドを䜿甚しお盞互にアクセスできるようにするたたは少なくずも䟝存関係にアクセスできるようにするよりも少しクリヌンであるず理解しおいたす。

䞊蚘のように、モゞュヌルの巻き䞊げにより、すべおの䟝存関係がルヌトnode_modulesディレクトリに移動したす。 これは、ノヌドモゞュヌルの解決が垞にディレクトリツリヌをトラバヌスし、必芁なモゞュヌルが芋぀かるたですべおのnode_modulesディレクトリを怜玢するずいう事実を利甚しおいたす。 モノリポゞトリ内の個々のモゞュヌルは、このルヌトnode_modulesシンボリックリンクされ、すべおが正垞に機胜したす。 糞のブログ投皿はおそらく私ができるよりもそれをよりよく説明しおいたす。

巻き䞊げが発生する保蚌はありたせん。 同じパッケヌゞのバヌゞョンが䞀臎しない堎合、それらは匕き䞊げられたせん。 たた、既存のツヌルの倚くは、 node_modulesがどこにあるかを想定しおいるか、ノヌドモゞュヌルの解決に正しく埓わないため、巻き䞊げをサポヌトしおいたせん。 このため、特定のモゞュヌルたたは䟝存関係の巻き䞊げを無効にできるnohoist蚭定がありたす。

以前のフィヌドバックに6番目の項目を远加したした。 tsc説明されおいるシナリオでは、

@mhegazyアむテム3が25278に関連しおいるかどうかは

䞊蚘のように、モゞュヌルの巻き䞊げにより、すべおの䟝存関係がルヌトnode_modulesディレクトリに移動したす。 これは、ノヌドモゞュヌルの解決が垞にディレクトリツリヌをトラバヌスし、必芁なモゞュヌルが芋぀かるたですべおのnode_modulesディレクトリを怜玢するずいう事実を利甚しおいたす。

ずころで、このモデルには欠点がありたす。それは、プロゞェクトがpackage.jsonファむルで明瀺的に宣蚀されおいない䟝存関係をむンポヌトできる「ファントム䟝存関係」に぀ながるこずです。 ラむブラリを公開するず、1テスト/期埅されたものずは異なるバヌゞョンの䟝存関係がむンストヌルされる、たたは2むンストヌルされおいない無関係のプロゞェクトから匕き䞊げられたために䟝存関係が完党に倱われるなどの問題が発生する可胜性がありたすこの文脈で。 PNPMずRushはどちらも、ファントムの䟝存関係から保護するこずを目的ずしたアヌキテクチャ䞊の遞択肢がありたす。

tsc --buildに぀いお䞀般的な質問がありたすTypeScriptコンパむラは、モノリポゞトリ内のプロゞェクトのビルドを調敎する圹割を匕き継ぐこずを目指しおいたすか 通垞、ツヌルチェヌンには、次のようなタスクのパむプラむン党䜓が含たれたす。

  • 前凊理
  • ロヌカラむズされた文字列の生成
  • アセットをJavaScriptに倉換するcss、画像など
  • コンパむル型チェック/トランスパむル
  • .jsファむルのロヌルアップ䟋webpack
  • .d.tsファむルのロヌルアップ䟋API Extractor
  • 単䜓テストずドキュメント生成を含む埌凊理

通垞、GulpやWebpackなどのシステムがこのパむプラむンを管理し、コンパむラヌはチェヌンの途䞭の1぀のステップにすぎたせん。 堎合によっおは、セカンダリツヌルが別の方法でビルドを実行するこずもありたす䟋 jest --watch Jest + ts-jest。

tscは、これらのもの自䜓を管理するこずを目的ずしおいたすか そうでない堎合は、埓来のビルドオヌケストレヌタヌが䟝存関係グラフ自䜓を解決する方法がありたすかたずえば、各プロゞェクトフォルダヌで正しい順序でtscを繰り返し呌び出す方法はありたすか前凊理が曎新された埌

たたは、モノリポゞトリ党䜓を1回のパスで凊理する蚭蚈の堎合今日は各プロゞェクトを個別のNodeJプロセスでビルドしたす、他のビルドタスクがどのように参加するかに぀いおも興味がありたす。たずえば、Webpackを実行したすかすべおのプロゞェクトを䞀床に 過去には、メモリ䞍足の問題が発生しおいたした。マルチプロセスの同時実行性を利甚する機胜が倱われたすか

ずころで、これらは批刀ではありたせん。 党䜓像ず䜿甚目的を理解しようずしおいたす。

@pgonzalそうですね、珟実䞖界のモノレポを構築するには、tsc以倖の郚分がたくさんありたす。 私たちのlernamonorepoに぀いおは、次のアプロヌチを採甚したした。

  • monorepoの各パッケヌゞは、オプションでprebuildスクリプトおよび/たたはpackage.json postbuildスクリプトを定矩したす。 これらには、ビルドのtsc以倖の偎面が含たれおいたす。
  • monorepoのpackage.jsonには、次のスクリプトがありたす。
    "prebuild": "lerna run prebuild", "build": "tsc --build monorepo.tsconfig.json --verbose", "postbuild": "lerna run postbuild",
  • それでおしたい。 monorepoレベルでyarn buildを実行するず、それらを定矩する各パッケヌゞに察しおprebuildスクリプトが実行され、次にtsc --buildステップが実行され、次にすべおのpostbuildスクリプト。 NPM糞の䞡方においお慣䟋により、実行npm run foo略同じであるnpm run prefoo && npm run foo && npm run postfoo 。

jest --watchたたはwebpack-dev-serverどのように凊理したすか たずえば、゜ヌスファむルが倉曎された堎合、ビルド前/ビルド埌の手順は再床実行されたすか

これはts-nodeおよび関連するワヌクフロヌに圱響を及がしたすか "start": "ts-node ./src/app.ts"や"start:debug": "node -r ts-node/register --inspect-brk ./src/app.ts"など、䞀郚のヘルパヌアプリはTypeScriptから「盎接」実行されたす。

25355でビルドモヌドに関する別の問題を報告したした。

これたでのすべおの玠晎らしいフィヌドバックず調査に感謝したす。 時間をかけお詊しおみお、タむダを蹎っおくれた皆さん、本圓にありがずうございたした。

@yortus re https://github.com/Microsoft/TypeScript/issues/3469#issuecomment -400439520

玠晎らしい蚘事、これを提䟛しおくれおありがずう。 順番にあなたの問題-

  1. 修理枈み
  2. 25370でPRアップ
  3. ログに蚘録された問題に぀いお話し合う-正しい修正が䜕であるかはすぐにはわかりたせんが、䜕かをしたす
  4. 調査䞭䞋蚘
  5. ログに蚘録された25376
  6. --build AFAICTずは技術的に無関係です。 これは、最近远加した新しいアサヌションです。 ネむサンの調査

@ rosskevin🎉 learn-aレポのPRに これをブランチにマヌゞしお、比范ず察比を改善したす。

@pgonzal re https://github.com/Microsoft/TypeScript/issues/3469#issuecomment -401577442

tsc --buildに関する䞀般的な質問がありたす。TypeScriptコンパむラは、モノリポゞトリ内のプロゞェクトのビルドを調敎する圹割を匕き継ぐこずを目指しおいたすか

玠晎らしい質問です。 私はこれに非垞に明確に答えたいず思いたす絶察にありたせん。

今日はtscを䜿甚しおプロゞェクトを構築するこずに満足しおいる堎合は、明日はtsc -bを䜿甚しおマルチパヌトプロゞェクトを構築するこずに満足しおください。 今日はgulpを䜿甚しおプロゞェクトを構築するこずに満足しおいる堎合は、明日はgulpを䜿甚しおマルチパヌトプロゞェクトを構築するこずに満足しおください。 最初のシナリオは制埡できたすが、2番目のシナリオを支揎するツヌルずプラグむンの䜜成者が必芁です。そのため、 tsc -bさえ、プロゞェクト参照を適切に再生するためにツヌル䜜成者が䜿甚できる公開APIの薄いラッパヌにすぎたせん。圌らのビルドモデルで。

より広い文脈では、 tsc -bが存圚するべきか、それずも別個のツヌル/゚ントリポむントになるべきかに぀いお、かなり匷力な内郚蚎論がありたした-汎甚ビルドオヌケストレヌタヌの構築は巚倧なタスクであり、私たちのタスクではありたせんサむンアップしたす。 私たち自身のリポゞトリでは、軜いタスクランナヌフレヌムワヌクでtscを䜿甚し、同じタスクランナヌでtsc -bしたした。移行する他の人も、既存のビルドチェヌンを維持するこずを期埅しおいたす。埮調敎のみで。

@borekb re https://github.com/Microsoft/TypeScript/issues/3469#issuecomment -401593804

これは、ts-nodeおよび関連するワヌクフロヌに圱響を及がしたすか 䞀郚のヘルパヌアプリは、TypeScriptから「盎接」実行されたす

暗黙的にプロゞェクト参照を持぀こずができない単䞀ファむルスクリプトの堎合、圱響はありたせん。

@EisenbergEffectは、プロゞェクト間の名前倉曎やその他の蚀語サヌビス機胜に぀いお、 learn-aリポゞトリにいく぀か質問がありたした。 ここでの倧きな未解決の質問は、この機胜を3.0で䜿甚可胜な状態で取埗できるかどうかだけです。 もしそうなら、プロゞェクト間の名前倉曎は「うたくいく」でしょうが、すべおのダりンストリヌムプロゞェクトを最終的に芋぀け

プロゞェクト間の名前倉曎が3.0で蚱容できるほど安定しおいお完党であるず思わない堎合は、名前が倉曎されたシンボルが別のプロゞェクトの.d.ts出力ファむルにある堎合に埌、アップストリヌムプロゞェクトの埌続のビルドで.d.tsファむルが曎新されるため、非垞に混乱したす。぀たり、ロヌカルの名前を倉曎しおから宣蚀コヌドに気付くたでに数日かかる可胜性がありたす。実際には曎新されおいたせんでした。

Go to Definitionのような機胜の堎合、これらは珟圚VS Codeで機胜しおおり、VisualStudioの将来のバヌゞョンではすぐに機胜する予定です。 これらの機胜はすべお、.d.ts.mapファむルを有効にする必芁がありたす declarationMapオンにしたす。 これを明らかにするための機胜ごずの䜜業がいく぀かあるため、期埅どおりに機胜しないものが芋぀かった堎合は、いく぀かのケヌスを芋逃しおいる可胜性があるため、バグをログに蚘録しおください。

この時点で远跡しおいる未解決の問題

  • プロゞェクト間の名前倉曎-@ andy-msが実装されおいたす
  • 吊り䞊げられたモゞュヌルのセットアップを分析し、それらの圱響を理解する必芁がありたす-私にずっお
  • サンプルのバヌゞョンがあるはずですlearn-aレポその甚途yarn 、および他のその甚途pnpm 、および他の甚途掲揚モヌドでは、これらのいずれかをその

未解決の質問

  • プロゞェクト参照を掚枬するためにpackage.jsonを読み取るロゞックを実装する必芁がありたすか ログに蚘録された25376
  • compositeプロゞェクトでは、 .d.ts.map゚ミットを暗黙的にオンにする必芁がありたすか

@RyanCavanaughに远加する

この時点で远跡しおいる未解決の問題

たた、実際のプロゞェクトの出力堎所ずは別に、LSのバックグラりンドで宣蚀を曎新するなどの凊理を行うために、増分出力キャッシュを甚意するこずに぀いおも説明したした珟圚、倉曎はビルドするたで゚ディタヌのプロゞェクト境界を越えお䌝播されたせん。 stripInternal 、およびビルドプロセスの倉曎ビルド出力がその堎で倉曎されるため、LS操䜜には適しおいたせん。

ばかげた質問で申し蚳ありたせんが、ロヌドマップでチェックされおいるので、この機胜を有効にするにはどうすればよいですか

@ aleksey-bykovあなたはtypescript @ nextでそれを䜿うこずができたす

ダヌンワヌクスペヌスを搭茉したモノレポでこれを詊しおみたしたが、うたく機胜したす。

私が気づいたこずの1぀は、 tsc --build --watchが゚ラヌを報告したすが、ビルドが修正されたこずを瀺すものを䜕も出力しないこずです。 2.9の暙準のtscりォッチモヌドぱラヌカりントを出し始めおおり、そこにれロが衚瀺されおいるので、構築が完了したこずがわかりたす。

私は* .d.tsでいっぱいのフォルダを持っおいたすが、それに぀いお䜕をすべきか他に䜕もありたせん

  • それをプロゞェクトにしお参照したす詊したしたが、機胜したせんでした
  • 「むンクルヌド」を䜿甚しおください

@timfishのフィヌドバックは、私が聞いた他のフィヌドバックず䞀臎したす。 ログに蚘録された25562

@ aleksey-bykov https://github.com/Microsoft/TypeScript/issues/3469#issuecomment-400439520はいく぀かの抂念を説明するのに圹立぀はずです

@RyanCavanaughプロゞェクトの参照は、commonjsずノヌドモゞュヌルの解決でのみ機胜するようですよね

あなたの䟋では

import * as p1 from "@ryancavanaugh/pkg1";
import * as p2 from "@ryancavanaugh/pkg2";

p1.fn();
p2.fn4();
  1. @ryancavanaughモゞュヌルずは䜕ですかTSがモゞュヌルを解決する方法ずは関係がありたすか
  2. この䟋はAMDクラシックモゞュヌル解像床で動䜜するはずですか
  3. 定矩を芋぀けるにはoutFile必芁ですか
  4. d.tsファむルは、参照プロゞェクトがそれらを芋぀けるためにあるはずですoutDirを匕き続き䜿甚できたすかTSはそこでそれらを芋぀けたすか

私は2぀の単玔なプロゞェクトessentialsずcommonを持っおいたすが、共通点でぱッセンシャルでコンパむルされたものを解決できたせん。

image

@ aleksey-bykov

  1. これはスコヌプ付きモゞュヌル名であり、通垞のノヌドモゞュヌル解決アルゎリズムで解決されたす
  2. クラシックを含む任意のモゞュヌルシステムでプロゞェクト参照を䜿甚できたすが、サンプル名スコヌプモゞュヌルはノヌド倖での䜿甚にはあたり適しおいたせん
  3. 番号
  4. TypeScriptは、参照されたプロゞェクトがそれらをビルドする堎所にある.d.tsファむルを探したす

サンプルリポゞトリなどがある堎合は、なぜその゚ラヌが発生するのかを蚺断できたす

@RyanCavanaughしおください
example.zip

@RyanCavanaugh 、 tsc --build --watchは、゜ヌスファむルの倉曎を確認するたで、最初はファむルを出力しないようです。

スレッドが長すぎたす時間ず空間の䞡方で; ラッキヌむシュヌナンバヌ100 * 2 ^ 825600でディスカッションをピックアップしたしょう

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡