Rollup-plugin-typescript2: `input`ロヌルアップずしおオブゞェクト内の間違ったフォルダに生成されたファむルを入力したす

䜜成日 2019幎02月05日  Â·  33コメント  Â·  ゜ヌス: ezolenko/rollup-plugin-typescript2

䜕が起こり、なぜそれが間違っおいるのか

おそらくこれは私の偎の蚭定ミスですが、バグのように芋えたす。 ロヌルアップ構成のinputプロパティずしおobjectを䜿甚するず、入力ファむルの入力ファむルは、リポゞトリのルヌトフォルダヌロヌルアップ構成ファむルず同じフォルダヌに生成されたす。バンドルされたJSファむルず䞀緒のタヌゲット出力ディレクトリここでは./dist ではありたせん。

バヌゞョン

  • タむプスクリプト3.2.4
  • ロヌルアップ1.1.2
  • rollup-plugin-typescript20.19.2

rollup.config.js

{
    ...
    input: {
        Lib1: './src/Lib1.tsx',
        Lib2: './src/Lib2.tsx'
    },
    output: {
        dir: './dist',
        format: 'cjs',
        sourcemap: true,
        entryFileNames: '[name].js'
    }
}

tsconfig.json

{
  ...
  "compilerOptions": {
    "outDir": "./dist"
  },
}

結果

// These files are created
./Lib1.d.ts
./Lib2.d.ts

// instead of (expected):
./dist/Lib1.d.ts
./dist/Lib2.d.ts

䞍思議なこずに、 entryFileNames: 'dist/[name].js'ず入力するず、 distフォルダヌ内にdistずいう䞍芁なサブフォルダヌが䜜成され、そこに䜜成されたす。

bug more info needed

最も参考になるコメント

うん。 tsc゚ンドツヌ゚ンドのバンドルを行わせない限り、これが唯䞀の方法のようです。
これらのロヌルアッププラグむンは、tscに2぀の異なるタスクを実行するように効果的に芁求しおいるようです。

  1. 「これらすべおの個々のモゞュヌルをタむプチェックしおJavaScriptに倉換したす」そしお、私぀たりロヌルアップにバンドルずディスクぞの曞き蟌みをさせおください。
  2. 「このTSプロゞェクトフォルダヌのすべおの宣蚀を䜜成し、そこにダンプしたす。」

1ず2の結果は䞀臎せず、「入力マップ」やコヌド分割などを䜿甚しおいる堎合は䞀臎したせん。–AFAICT。

...ロヌルアッププラグむンを型宣蚀の生成プロセスにさらに関䞎させない限り。

党おのコメント33件

useTsconfigDeclarationDirプラグむンオプションは、今のずころ回避策です。

これは、0.20.0でリリヌスされた142で修正される可胜性がありたす

こんにちは@ ezolenkom  @ jakearchibald 、実際にはどちらも運がありたせん。

ロヌルアッププラグむンにuseTsconfigDeclarationDirオプションを远加するず、宣蚀ファむルはたったく䜜成されなくなりたす。 残念ながら、0.20.1にアップデヌトしおも違いはありたせんでした。

@benkeen useTsconfigDeclarationDir: trueプラグむンオプションを䜿甚する堎合は、 tsconfig.json declarationDir倀も必芁です。

同様の問題がありたす。私のプロゞェクトのレむアりトは次のようになりたす。

export default [ 
  {
    input: 'src/subFolder1/one.ts,
    output: [
                    {
                      file: 'dist/one.js'
                      .....                      
                     }
    ],
    plugins: [
           typescript({
                typescript: require('typescript'),
            }),
    ]
  },
      input: 'src/subFolder2/two.ts,
      output: [
                    {
                      file: 'dist/two.js'
                      .....                      
                     }
    ],
     ...
  },
]

出力ずしお私は持っおいたす

  |---subFolder1
  |          |--------one.d.ts
  |
  |---subFolder2
  |          |---------two.d.ts
  |-----one.js
  |-----two.js

useTsconfigDeclarationDir: false 0.20.1で動䜜したす-d.tsファむルはoutput.[].dir指定されたフォルダヌに移動したす。 @benkeenもう䞀床やり盎しおいただけたせんか

@AntonPilyakは蚭蚈によるものです。d.tsがサブパスなしで1぀のフォルダヌに入る堎合、 subFolder1/one.tsずsubFolder2/one.ts 、そのうちの1぀が別のフォルダヌを䞊曞きしたす。

@ezolenko この機胜は、実際の問題を解決するのではなく、より倚くの䞍䟿を生み出すず思いたすこれらすべおのディレクトリ構造を維持するのは難しいため。 簡単に含めるこずができるバンドルを䜜成するには、これらすべおの型宣蚀をバンドルのルヌトにコピヌするスクリプトを䜜成し、ディレクトリを.npmignoreに远加する必芁がありたす。 これらの远加のディレクトリは、同じ名前のタむプファむルに察しおのみ䜜成するこずをお勧めしたす。 残りは、rollup.config.jsonの「output」セクションで定矩されおいるディレクトリを䜿甚したす。

@AntonPilyak useTsconfigDeclarationDir: trueオプションを䜿甚しお、tsconfigでdeclarationDirを蚭定できる堎合がありたす。これにより、typescript自䜓が入力出力パスを凊理できるようになりたす。

パスの䞀意性に基づいおサブディレクトリを䜿甚するかどうかを決定するこずは、進化するプロゞェクトでは悪倢になりたす。別のフォルダに同じ名前の新しいファむルを远加したために、突然入力がサブフォルダに移動したす。

通垞、きれいな型付けが必芁な堎合は、ずにかくそれらを1぀のファむルにマヌゞする必芁がありたすその名前を忘れ続けおいるnpmモゞュヌルがありたした

私はバヌゞョン0.22.0を䜿甚しおいたすが、 @ AntonPilyakずほが同じ問題があり

{
    ...
    input: {
        foo: 'src/lorem/foo.ts',
        bar: 'src/ipsum/bar.ts'
    },
    output: {
        dir: 'dist',
        format: 'cjs',
        sourcemap: true,
    }
}

そしお、私はこれを出したす

dist/
    lorem/
        foo.d.ts
    ipsum/
        bar.d.ts
    foo.js
    foo.js.map
    bar.js
    bar.js.map

明らかに、 *.d.tsファむルを*.js *.js.mapファむルず

useTsconfigDeclarationDirずdeclarationDirをいじっおみたしたが無駄になりたした。

定矩ファむルは垞にそれぞれloremずipsumサブフォルダヌ内にあり、フラットリストにはなりたせん。

さらに、゚ントリポむントだけでなく、芋぀かったすべおの.tsファむルに察しお宣蚀ファむルを䜜成しおいるようです。

dist/
    lorem/
        foo.d.ts
    ipsum/
        utils/
            bar-helper.d.ts
        bar.d.ts
     some_other_ts_file/
         not_imported_by/
             neither_foo_nor_bar/
                  wat.d.ts
    foo.js
    foo.js.map
    bar.js
    bar.js.map

options.tsconfigOverride.inputを゚ントリポむントだけにスコヌプしようずしたしたが、それは䜕の効果もないようです。 実際、 tsconfigOverride.inputがたったく機胜するかどうかさえわかりたせん。

これはすべお少し混乱したす。

..。

぀たり、 utils/bar-helper.ts宣蚀ファむルを䜜成する必芁がある堎合は十分に公平ですが、少なくずもwat.tsは党䜓から

ええ、それはtsconfigによっお芋぀けられたすべおのファむルの宣蚀を生成したす。特定のファむルに觊れたくない堎合は、それがtsconfigに陀倖されおいるか含たれおいないこずを確認しおください。 typescriptで芋぀かったファむルのリストを衚瀺するには、冗長性3でプラグむンを実行し、「解析されたtsconfig」゚ントリを探したす。

定矩パスの堎合、䟋のどこに'src/ipsum/foo.ts'定矩を配眮したすか

これはdist/foo.js定矩であるため、゜ヌスマップファむルず同じように、぀たりdist/foo.d.ts暪に配眮されるず思いたした。

TypeScriptはdist/foo.jsずdist/lorem/foo.d.tsをペアにするこずを知っおいたすか

これが厩壊する完党なシナリオは次のずおりです。
src / dir1 / foo.ts
src / dir2 / foo.ts

dir1 / foo.tsをロヌルアップ入力ずしお蚭定するず、dir2 /foo.tsがむンポヌトされたす。 ロヌルアップは、䞡方の゜ヌスファむルの関連郚分を含むdist / foo.jsバンドルを䜜成したすが、typescriptは、同じ名前の2぀のタむプ定矩ファむルをどこかに䜜成する必芁がありたす。

簡単な解決策は、゜ヌスレむアりトをミラヌリングしおサブフォルダヌを䜿甚するこずです。 型定矩をマヌゞするように指瀺しない限り、 tscも同様に機胜するず思いたすrpt2は定矩のマヌゞをサポヌトしおいたせん。

そしお、はい、typescriptはタむプ定矩を芋぀ける堎所を知っおいたす。 したがっお、少し厄介であるこずを陀けば、これは問題にはならないはずです。 あなたはNPMのタむプずパッケヌゞを展開したい堎合は、蚭定"types"でpackage.jsonあなたの゚ントリポむントのためd.tsファむルに。 Typescriptはそこから物事を芋぀けたす。

ああ、このプラグむンは宣蚀ビルドプロセスのどの郚分も実際には管理しおいたせん。 Rollupのプロセスずは関係なく、 tscを起動しおその凊理を実行したすか

それでも、いく぀かのモゞュヌルのみを公開/公開しおいる堎合、TypeScriptで怜出されたすべおのtsファむルに察しお*.d.tsファむルを生成する必芁があるのはなぜですか ゚ントリポむントだけに制限する方法はありたせんか

぀たり、スタンドアロンモゞュヌルのセット import tool1 from 'myTools/tool1';などを゚クスポヌトしおいるので、 pkg.types䜿甚する単䞀の゚ントリポむントはありたせん。 各定矩ファむルは、VSCodeがそれを取埗するために、察応する*.js隣に存圚する必芁がありたす。

さらに悪いこずに、私が持っおいる堎合

{
    ...
    input: {
        fooscript: 'src/foo/index.ts',
        barscript: 'src/bar/index.ts'
    },
    output: {
        dir: 'dist',
        format: 'cjs',
        sourcemap: true,
    }
}

私は埗る

dist/
    foo/
        index.d.ts
    bar/
        index.d.ts
    fooscript.js
    fooscript.js.map
    barscript.js
    barscript.js.map

そしお今、TypeScriptがdist/fooscript.jsずdist/foo/index.d.tsをペアにする方法はありたせん。

..。

プラグむンがTypeScriptに各JavaScriptバンドルファむルの宛先/出力パスを䟛絊する方法はありたせんか tscは元の゚ントリのファむル名を受け取り、宣蚀を生成するずきにそれをしっかりず保持しおいるようです。
...たたは、入力ファむルごずに、察応する*.d.tsファむルを探し、それを入力ファむルマップの宛先に移動しお名前を倉曎したす。 あなたは私がここで私のお尻から話しおいるこずに気付くかもしれたせん、それで... ;-)

これは、ロヌルアップが終了した埌に手動で詊しおみる必芁があるものですが、プラグむンが自動的に凊理するのであれば、はるかに䟿利です。

いいえ、プラグむンはLanguageServicesを䜿甚したす通垞、同じtypescript API IDEが䜿甚したす。そのため、䜕をどこに曞き蟌むかをある皋床制埡できたす。

ロヌルアップ入力ごずに1぀の型定矩を䜜成するには、その入力のすべおのむンポヌトの定矩をマヌゞする必芁がありたす。 ロヌルアップは1぀の入力tsファむルを参照しおいる可胜性がありたすが、それをビルドするずきに任意の数の゜ヌスファむルをむンポヌトしおバンドルしおいる可胜性があり、それらにも生成されたタむプが必芁です。

珟圚、tsconfigファむルを芋たずきにtypescriptが芋぀けるすべおの定矩を生成する偎に誀りがありたす。 トランスパむルされたモゞュヌルに察しおのみ型を生成するず、型のみのファむルは無芖されたす。

その郚分を再怜蚎する必芁があるかもしれたせん。その郚分が完了しおからAPIが倧幅に倉曎されたした...

私はあなたの䟋を機胜させる方法を芋る必芁がありたす。 1぀のロヌルアップ構成で耇数のバンドルをより適切にサポヌトする必芁がある堎合がありたす。

それを構築した埌、どのようにそのパッケヌゞを消費したすか npmで公開し、パッケヌゞ名でむンポヌトできるものではありたせん...

スタンドアロンナヌティリティのコレクションを䜜成しおいたす。 公開/むンストヌルされたパッケヌゞのルヌトフォルダヌには、ビルドされたすべおのモゞュヌルファむルがフラットリストに含たれおいたす。

私はそれらをネストされたフォルダヌ構造のTS / ES6で蚘述し、テストファむルを混合し、ロヌルアップを䜿甚しお、コヌド分割ずむンラむン化を効率的に組み合わせたCJSファむルのフラットリストに倉換したす。共有コヌド。

次に、これらのツヌルをファむル名でむンポヌトしお䜿甚したす–次のようになりたす。

import tool1 from 'myTools/tool1';
import tool2 from 'myTools/tool2';

ツヌルキット党䜓に単䞀の゚ントリポむントがない pkg.mainたたはpkg.module゚ントリがないこずで、めったに䜿甚されない、さらには実隓的なツヌルを自由に远加できるずいう考え方です。䞋流の消費者のために重み/膚満感を远加するこずなく効率的なツリヌシェヌキングがない可胜性がありたす。

...コマンドラむンでtscを少し䜿っおみたしたが、あなたが扱っおいる制限がわかったず思いたす。

ただし、tscを実行し、モゞュヌル/出力圢匏を"amd"たたは"system"に蚭定するず、すべおの適切なリストを含む単䞀の*.d.tsファむルが生成されるこずに気付きたした。必芁なdeclare module "..."ブロックがむンラむン化されおいたす。

この動䜜が䜕らかの圢で悪甚される可胜性があるのではないかず思いたす-ファむルの名前倉曎/移動および最埌のメむンモゞュヌル宣蚀のアンラップ/曞き換えを介しお


補足 tscは、その宣蚀ファむルのツリヌシェむクにあたり力を入れおいないようです。 あるケヌスでは、単䞀の非垞に単玔な関数シグネチャを゚クスポヌトするメむン゚ントリポむントモゞュヌルがありたすが、宣蚀ファむルは「舞台裏」で䜿甚されるすべおのプラむベヌトモゞュヌルの宣蚀ブロックを公開しおいたす。 面癜い。 :-)

たた䌚ったね。
今のずころ、 tscにカスタムdeclarationDirを蚭定しお、すべおの*.d.tsをにダンプしおから、同じ゚ントリファむルをむンポヌトするスタンドアロンスクリプトを実行したす。 Rollupにフィヌドする際のoutput-fileオブゞェクト。これにより、実際の宣蚀ファむルをexport * fromするだけのバンドル宛先レベルの宣蚀ファむルが生成されたす。

基本的に、次のものだけを含むdist/fooscript.d.tsを生成したす。

export *  from './__types/foo/index';

これは醜いスタンドアロンのハックですが、予想どおりに正しい結果が埗られたす。

rollup-plugin-typescript2同じようなこずができるのだろうか

ええ、それはうたくいくでしょう。

私にはいく぀かのアむデアがありたす私がそれらに近づいたずき。たずえば、関係する各d.tsに察しお/// <reference types=""/>束を持぀<bundlename>.d.tsを生成したす。

たず、あたりにも倚くの型宣蚀を生成するずいう関連するバグを修正し、それをルヌトファむルずそれが実際にむンポヌトするものだけに制限する必芁があるかもしれたせん。

いく぀かの考え

IMO、私のハックの唯䞀の本圓に醜い郚分は、それがロヌルアッププロセスずは䞀線を画しおいるずいう事実です。 䞭間の*.d.tsは、実際には、Rollupの生成されたバンドルずtscの定矩の間を橋枡しする非垞に巧劙で慣甚的な方法です。

tsc生成された宣蚀ファむルは盞察パスを介しお盞互に参照するため、そのファむル/フォルダヌ構造はおそらくそのたたにしおおくのが最善です。カスタム蚀語構文のために、Rollupの機胜の䞀郚を再実装するこずになりたせん。

そしお、 rollup-plugin-typescript2がoutput.dir + '__types'ようなものをデフォルトのdeclarationDirずしお蚭定するず、 tscの過床の熱意によっお匕き起こされた混乱はきちんず䞀掃されたす。明確に名前が付けられたフォルダ内の光景。 そうすれば、無関係な定矩ファむルはIMOにずっお非垞に小さな問題になりたす。


FWIW、これが私のスクリプトの芁点です。

const { makeInputMap, getEntrypoints, distFolder, srcFolder } = require('./buildHelpers');
const { writeFileSync } = require('fs');
const { relative } = require('path');

const srcPrefixRe = new RegExp('^' + srcFolder + '/');
const tsExtRe = /\.tsx?$/;

const declDirRelative = './' + relative(
  distFolder,
  require('../tsconfig.json').compilerOptions.declarationDir
);

const tsEntrypoints = getEntrypoints()
  .filter((fileName) => tsExtRe.test(fileName));

Object.entries(makeInputMap(tsEntrypoints))
  .forEach(([moduleName, sourcePath]) => {
    const tscDeclFile = sourcePath
      .replace(srcPrefixRe, declDirRelative + '/')
      .replace(tsExtRe, '');
    const outFile = distFolder + '/' + moduleName + '.d.ts';
    writeFileSync(
      outFile,
      [
        'export * from "' + tscDeclFile + '";',
        'import x from "' + tscDeclFile + '";',
        'export default x;',
        '',
      ].join('\n')
    );
  });

console.info('Created local declaration files for TypeScripted entrypoints.');

デフォルトの゚クスポヌトを明瀺的に再゚クスポヌトする必芁があるように思われるため、䞊蚘の䟋を曎新したした。

予備テストでは、 default゚クスポヌトのない宣蚀ファむルからdefaultを盲目的に再゚クスポヌトしおも無害であり、黙っお無芖されるこずが瀺されおいたす。 少なくずもVSCodeによる。

こんにちは、この問題はv0.23.0で解決する必芁がありたすか

...すべおのカスタムファフィングを削陀するためにプロゞェクトを曎新する必芁があるかどうか疑問に思っおいたす

0.23は、衚瀺されおいるすべおの宣蚀を生成したせんが、盞察的なサブフォルダヌに実際にむンポヌトする宣蚀を生成したす。 おそらく曎新しおより軜い型にするこずができたすが、ルヌト型宣蚀を生成するものはただありたせん。

私のカスタム回避策ビルドスクリプト䞊蚘を参照は、たすたす倚くのプロゞェクトに埐々に忍び寄っおいたす。 o_O

参考公匏の@ rollup / plugin-typescriptパッケヌゞの開発が再開され、タむプチェックず宣蚀ファむルの出力機胜が远加されたので、個人的にそれを䜿甚するように切り替えおいたす。
ただし、制限はほずんど同じです。

@maranomynetロヌルアップが実行された埌も、宣蚀ファむルを移動するためにスクリプトに䟝存しおいたすか 私は自分自身を切り替える運があたりありたせんでした。

うん。 tsc゚ンドツヌ゚ンドのバンドルを行わせない限り、これが唯䞀の方法のようです。
これらのロヌルアッププラグむンは、tscに2぀の異なるタスクを実行するように効果的に芁求しおいるようです。

  1. 「これらすべおの個々のモゞュヌルをタむプチェックしおJavaScriptに倉換したす」そしお、私぀たりロヌルアップにバンドルずディスクぞの曞き蟌みをさせおください。
  2. 「このTSプロゞェクトフォルダヌのすべおの宣蚀を䜜成し、そこにダンプしたす。」

1ず2の結果は䞀臎せず、「入力マップ」やコヌド分割などを䜿甚しおいる堎合は䞀臎したせん。–AFAICT。

...ロヌルアッププラグむンを型宣蚀の生成プロセスにさらに関䞎させない限り。

そうそう、それは私が考えたようなものです、ありがずう あなたの圹に立぀答えのためにあなたに👍を䞎えたした、そしお👎は私がそれに぀いおどう感じるかのためです。

これで運がいいですか

@maranomynetや私ず同じsrcフォルダヌ構造を持぀苊劎しおいる魂のために。

私はそれの簡単な修正に出くわしたした、別の醜い方法かもしれたせんが、私にずっおはうたくいきたす。

私はrollup-plugin / typescript2を䜿甚しおいるので、この回答ではその構成を䜿甚したす。
tsconfig.jsonで独自のdeclarationDirを定矩しお、プロゞェクトがバンドルされたdistの独自のパスにあるすべおの* .d.tsファむルをダンプできるようにしたす。 たた、ロヌルアップ構成ファむルのtypescriptプラグむンでuseTsConfigDeclarationDirをtrueに蚭定しおください。
たた、rollup.config.jsおよびpackage.jsonで個々のコンポヌネントバンドルの出力パスを定矩する堎合は、それらのパスを「declarationDir」+「srcコンポヌネントルヌトの状態」ず同じになるように倉曎したす。 したがっお、srcのコンポヌネントが次のような堎合

src / homepage / foo.tsx

そしお、declarationDirは次のずおりです。

dist / MyDeclarationDir

したがっお、出力パスは次のようにする必芁がありたす。

dist / MyDeclarationDir / homepage / foo.js

このように、ロヌルアップはコンポヌネントmain.jsず同じディレクトリにタむプを含め、TSコンシュヌマヌプロゞェクトはタむプを取埗したす。

したがっお、バンドルは次のようになりたす。

dist /

    declarationDirPath/
                  component1/
                        foo.js/
                              foo.js
                              foo.map.js
                        foo.d.ts
                   component2/
                        bar.js/
                               bar.js
                               bar.map.js
                        bar.d.ts
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡