Rollup-plugin-typescript2: Fichier de saisie généré dans le mauvais dossier dans l'objet en tant que cumul "d'entrée"

CrĂ©Ă© le 5 fĂ©vr. 2019  Â·  33Commentaires  Â·  Source: ezolenko/rollup-plugin-typescript2

Que se passe-t-il et pourquoi c'est mal

Il s'agit peut-ĂȘtre d'une mauvaise configuration de ma part, mais cela ressemble Ă  un bogue. Lorsque vous utilisez un object comme propriĂ©tĂ© input pour la configuration du rollup, le fichier de saisie pour les fichiers d'entrĂ©e est gĂ©nĂ©rĂ© dans le dossier racine du rĂ©fĂ©rentiel (mĂȘme dossier que le fichier de configuration du rollup) et pas le rĂ©pertoire de sortie cible (ici, ./dist ) avec le fichier JS fourni.

Versions

  • tapuscrit: 3.2.4
  • cumul : 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"
  },
}

RĂ©sultat:

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

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

Curieusement, si vous entrez entryFileNames: 'dist/[name].js' il crée un sous-dossier superflu appelé dist dans le dossier dist et les y crée.

bug more info needed

Commentaire le plus utile

Ouais. cela semble ĂȘtre le seul moyen Ă  moins que vous ne laissiez tsc faire le regroupement de bout en bout.
Ces plug-ins de cumul semblent effectivement demander à tsc d'effectuer deux tùches différentes :

  1. "Tapez et convertissez tous ces modules individuels en JavaScript" et laissez-moi (c'est-Ă -dire Rollup) faire le regroupement et l'Ă©criture sur le disque.
  2. "Faites toutes les déclarations pour ce dossier de projet TS et déposez-les là-bas."

Les rĂ©sultats de 1 et 2 ne correspondent pas et ne peuvent pas correspondre lorsque vous utilisez une « carte d'entrĂ©e » et une division de code, etc. – AFAICT.

... à moins que vous ne rendiez le plug-in de cumul beaucoup plus impliqué dans le processus de génération de déclaration de type.

Tous les 33 commentaires

L'option de plugin useTsconfigDeclarationDir est une solution de contournement pour le moment.

Cela pourrait ĂȘtre corrigĂ© par #142, publiĂ© en 0.20.0

Salut @ezolenkom & @jakearchibald , pas de chance non plus en fait.

Lors de l'ajout de l'option useTsconfigDeclarationDir dans mon plugin rollup, les fichiers de déclaration ne sont plus créés du tout. Et la mise à jour vers 0.20.1 n'a malheureusement pas fait de différence.

@benkeen lors de l'utilisation useTsconfigDeclarationDir: true option de plugin declarationDir dans tsconfig.json

ont des problÚmes similaires, la mise en page de mon projet est comme ceci :

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'
                      .....                      
                     }
    ],
     ...
  },
]

En sortie j'ai :

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

Fonctionne pour moi sur 0.20.1 avec useTsconfigDeclarationDir: false -- les fichiers d.ts vont dans les dossiers spécifiés dans output.[].dir . @benkeen pouvez-vous réessayer ?

@AntonPilyak c'est par conception - si d.ts allait dans un dossier sans sous-chemins, alors si vous aviez subFolder1/one.ts et subFolder2/one.ts , l'un d'entre eux en Ă©craserait un autre.

@ezolenko : cette fonctionnalitĂ©, je pense, crĂ©e plus d'inconvĂ©nients plutĂŽt que de rĂ©soudre un vrai problĂšme (car il est difficile de maintenir toutes ces structures de rĂ©pertoires). Je dois crĂ©er un script qui copie toutes ces dĂ©clarations de type Ă  la racine du bundle et ajouter les rĂ©pertoires Ă  .npmignore afin de crĂ©er un bundle facile Ă  inclure. Je vous suggĂšre de crĂ©er ces rĂ©pertoires supplĂ©mentaires UNIQUEMENT pour les fichiers de type portant les mĂȘmes noms. Et utilisez un rĂ©pertoire dĂ©fini dans la section 'output' de rollup.config.json pour le reste.

@AntonPilyak, vous pourrez peut-ĂȘtre utiliser l'option useTsconfigDeclarationDir: true , configurez declarationDir dans tsconfig, cela devrait laisser le script lui-mĂȘme gĂ©rer les chemins de sortie des frappes.

DĂ©cider si les sous-rĂ©pertoires doivent ĂȘtre utilisĂ©s en fonction de l'unicitĂ© des chemins serait un cauchemar dans un projet en Ă©volution, soudainement votre saisie se dĂ©placerait vers un sous-dossier uniquement parce que vous avez ajoutĂ© un nouveau fichier avec le mĂȘme nom dans un dossier diffĂ©rent.

Normalement, si vous voulez de jolies frappes, vous voudrez quand mĂȘme les fusionner en un seul fichier (il y avait un module npm dont j'oublie sans cesse le nom pour cela)

J'utilise la version 0.22.0 et j'ai Ă  peu prĂšs le mĂȘme problĂšme que @AntonPilyak

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

Et je sors ça :

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

Évidemment, j'aimerais que les fichiers *.d.ts soient placĂ©s Ă  cĂŽtĂ© des fichiers *.js et *.js.map .

J'ai essayé de jouer avec useTsconfigDeclarationDir et declarationDir en vain.

Les fichiers de définition finissent toujours dans les sous-dossiers lorem et ipsum respectivement, et jamais dans une liste plate.

De plus, il semble qu'il crée des fichiers de déclaration pour chaque fichier .ts qu'il trouve, pas seulement les points d'entrée.

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

J'ai essayĂ© de limiter options.tsconfigOverride.input uniquement aux points d'entrĂ©e, mais cela semble n'avoir aucun effet. En fait, je ne suis mĂȘme pas sĂ»r que tsconfigOverride.input fonctionne.

Tout cela est un peu confus.

...

Je veux dire, assez juste s'il a besoin de crĂ©er un fichier de dĂ©claration pour utils/bar-helper.ts mais au moins wat.ts doit ĂȘtre laissĂ© de cĂŽtĂ©.

Oui, il génÚre des déclarations pour tous les fichiers trouvés par tsconfig, si vous ne voulez pas qu'un fichier particulier soit touché, assurez-vous qu'il est exclu ou non inclus dans tsconfig. Pour voir la liste des fichiers trouvés par dactylographe, exécutez le plugin avec verbosity 3 et recherchez l'entrée "parsed tsconfig".

Pour le chemin des dĂ©finitions, oĂč dans votre exemple voudriez-vous que la dĂ©finition de 'src/ipsum/foo.ts' se trouve ?

Puisqu'il s'agit d'une définition de dist/foo.js j'avais supposé que cela finirait à cÎté - tout comme le fichier de carte source - c'est-à-dire dans dist/foo.d.ts .

TypeScript saura-t-il associer dist/foo.js et dist/lorem/foo.d.ts ?

Le scĂ©nario complet oĂč cela se dĂ©compose est :
src/dir1/foo.ts
src/dir2/foo.ts

dir1/foo.ts est dĂ©fini comme entrĂ©e de cumul et importe dir2/foo.ts. Rollup crĂ©era un bundle dist/foo.js qui contiendra les parties pertinentes des deux fichiers source, mais le script dactylographiĂ© doit crĂ©er 2 fichiers de dĂ©finition de type avec le mĂȘme nom quelque part.

La solution simple consiste à utiliser des sous-dossiers, en reflétant la disposition de la source. Je pense que c'est aussi ce que fait tsc , à moins que vous ne lui disiez de fusionner les définitions de types (rpt2 ne prend pas en charge la fusion de définitions).

Et oui, tapuscrit saura oĂč trouver les dĂ©finitions de type. Donc, en plus d'ĂȘtre un peu dĂ©sordonnĂ©, cela ne devrait pas ĂȘtre un problĂšme. Si vous souhaitez dĂ©ployer un package avec des types sur npm, dĂ©finissez "types" dans package.json sur le fichier d.ts pour votre point d'entrĂ©e. Typescript trouvera des choses Ă  partir de lĂ .

Ah, donc ce plugin ne gÚre vraiment aucune partie du processus de génération de déclaration. Il lance juste tsc pour faire son travail, sans rapport avec le processus de Rollup ?

Pourtant, si je n'expose/publie que quelques modules, pourquoi voudrais-je que TypeScript génÚre des fichiers *.d.ts pour chaque fichier ts qu'il rencontre ? N'y a-t-il aucun moyen de le limiter aux seuls points d'entrée ?

Le fait est que j'exporte un ensemble de modules autonomes ( import tool1 from 'myTools/tool1'; etc.) donc il n'y a pas de point d'entrée unique à utiliser dans pkg.types . Chaque fichier de définition doit résider à cÎté de son équivalent *.js pour que VSCode le récupÚre.

Pire encore, si j'ai

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

Je reçois:

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

Et maintenant, il n'y a aucun moyen pour TypeScript de jumeler dist/fooscript.js et dist/foo/index.d.ts .

...

Votre plugin ne pourrait-il pas fournir à TypeScript le chemin de destination/sortie pour chaque fichier de bundle JavaScript ? Il semble que tsc reçoive le nom de fichier d'entrée d'origine et le conserve bien lors de la génération des déclarations.
...ou pour chacun des fichiers d'entrĂ©e, recherchez le fichier *.d.ts correspondant et dĂ©placez-le + renommez-le vers la destination de la carte du fichier d'entrĂ©e. (Vous remarquerez peut-ĂȘtre que je parle de mon cul ici, alors... ;-)

C'est quelque chose que je suis obligé d'essayer manuellement aprÚs la fin du rollup - mais ce serait tellement mieux si le plugin le gÚre automatiquement.

Non, le plugin utilise LanguageServices (les mĂȘmes IDE d'API dactylographiĂ©s sont gĂ©nĂ©ralement utilisĂ©s), donc j'ai un certain contrĂŽle sur ce qu'il faut Ă©crire et oĂč.

Pour Ă©crire une dĂ©finition de type par entrĂ©e de cumul, nous devrons fusionner les dĂ©finitions de toutes les importations pour cette entrĂ©e. Le cumul peut voir un fichier ts d'entrĂ©e, mais il peut importer et regrouper un nombre quelconque de fichiers source lors de la crĂ©ation de celui-ci, ces types doivent Ă©galement ĂȘtre gĂ©nĂ©rĂ©s.

Actuellement, je me trompe du cÎté de la génération de définitions pour tout ce que le texte dactylographié trouve en regardant le fichier tsconfig. Si je génÚre des types uniquement pour les modules transpilés, les fichiers de type uniquement seront ignorés.

Je devrais peut-ĂȘtre revoir cette partie, l'API a considĂ©rablement changĂ© depuis que cette partie a Ă©tĂ© terminĂ©e ...

Je vais devoir regarder comment faire fonctionner votre exemple. Peut-ĂȘtre besoin d'une meilleure prise en charge de plusieurs bundles dans une configuration de cumul.

Comment consommez-vous ce package aprĂšs l'avoir construit? Ce n'est pas quelque chose que vous pouvez publier sur npm et importer par nom de package ...

Je fais une collection d'utilitaires autonomes. Le dossier racine du package publié/installé contient tous les fichiers du module construit dans une liste plate.

(Je les écris dans TS/ES6 dans une structure de dossiers imbriquée, avec des fichiers de test mélangés, et je m'appuie sur Rollup pour les convertir en une liste plate de fichiers CJS avec un mélange efficace de fractionnement de code et d'incorporation pour tout code partagé.)

Je consomme ensuite ces outils en les important par nom de fichier – comme ceci :

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

L'idĂ©e est qu'en n'ayant pas de point d'entrĂ©e unique pour l'ensemble de la boĂźte Ă  outils (pas d'entrĂ©es pkg.main ou pkg.module ), je peux ajouter sans souci des outils rarement utilisĂ©s, et mĂȘme expĂ©rimentaux. sans ajouter de poids/gonflement pour les consommateurs en aval (qui pourraient ne pas avoir de secouage efficace des arbres).

... J'ai un peu joué avec tsc sur la ligne de commande, et je pense que je vois maintenant les limites auxquelles vous faites face.

J'ai remarqué, cependant, que si vous exécutez tsc et définissez le format de module/sortie sur "amd" ou "system" , il génÚre un seul fichier *.d.ts avec une liste soignée de tous les blocs declare module "..." nécessaires en ligne.

Je me demande si ce comportement pourrait ĂȘtre exploitĂ© d'une maniĂšre ou d'une autre - via renommer/dĂ©placer un fichier et dĂ©baller/rĂ©Ă©crire la derniĂšre dĂ©claration de module (principal) ?


Remarque : je remarque également que tsc ne semble pas

Re-bonjour.
Pour l'instant, je dĂ©finis un declarationDir pour tsc dans lequel vider tous les *.d.ts , puis j'exĂ©cute un script autonome qui importe le mĂȘme fichier d'entrĂ©e vers- objet de fichier de sortie au fur et Ă  mesure que j'alimente Rollup, et il gĂ©nĂšre des fichiers de dĂ©claration au niveau de la destination du paquet qui se contentent de export * from le fichier de dĂ©claration rĂ©el.

Essentiellement, je génÚre dist/fooscript.d.ts qui ne contient que :

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

C'est un hack autonome laid, mais il fournit des résultats corrects de maniÚre prévisible.

Je me demande si rollup-plugin-typescript2 pourrait faire quelque chose de similaire ?

Cela fonctionnerait, ouais.

J'ai quelques idées (quand je les aborde), par exemple générer <bundlename>.d.ts qui a un tas de /// <reference types=""/> pour chaque d.ts impliqué.

Tout d'abord, je devrais peut-ĂȘtre corriger un bogue liĂ© Ă  la gĂ©nĂ©ration d'un trop grand nombre de dĂ©clarations de type et le limiter au seul fichier racine et Ă  tout ce qu'il importe rĂ©ellement.

Quelques réflexions :

OMI, la seule partie vraiment laide de mon hack est le fait qu'il se distingue du processus de Rollup. L'intermédiaire *.d.ts est en fait un moyen assez soigné et idiomatique de faire le pont entre les bundles générés par Rollup et les définitions de tsc .

Étant donnĂ© que les fichiers de dĂ©claration gĂ©nĂ©rĂ©s par tsc rĂ©fĂšrent les uns aux autres via des chemins relatifs, il est probablement prĂ©fĂ©rable de laisser cette structure de fichier/dossier seule - de peur que vous ne finissiez par rĂ©implĂ©menter des parties de la fonctionnalitĂ© de Rollup, pour une syntaxe de langage personnalisĂ©e.

Et si rollup-plugin-typescript2 définit quelque chose comme output.dir + '__types' comme valeur par défaut declarationDir , alors tout désordre causé par l'empressement excessif de tsc est soigneusement balayé. vue à l'intérieur d'un dossier clairement nommé. De cette façon, les fichiers de définition superflus deviennent une préoccupation trÚs mineure pour l'OMI.


FWIW, voici la viande de mon script :

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.');

J'ai mis Ă  jour l'exemple ci-dessus, car il semble que les exportations par dĂ©faut doivent ĂȘtre explicitement rĂ©exportĂ©es.

Des tests préliminaires indiquent que la réexportation aveugle de default partir d'un fichier de déclaration qui n'a pas d'exportation default est inoffensive et ignorée en silence. (Au moins par VSCode.)

Bonjour, ce problĂšme devrait-il ĂȘtre rĂ©solu dans la v0.23.0 ?

(... je me demande si je devrais essayer de mettre à jour mon projet pour supprimer tous les trucs personnalisés)

0.23 ne générera pas de déclaration pour tout ce qui est en vue, mais il générera toujours des déclarations que vous importez réellement dans leurs sous-dossiers relatifs. Vous pouvez probablement mettre à jour et avoir des types plus légers, mais il n'y a encore rien pour générer des déclarations de type racine.

Mon script de génération de contournement personnalisé (voir ci-dessus) s'insinue progressivement dans de plus en plus de mes projets. o_O

Pour info : le développement du package officiel @rollup/plugin-typescript a depuis repris, et il propose désormais une vérification de type et des fichiers de déclaration de sortie, donc je suis personnellement en train de l'utiliser.
Cependant, les limites sont sensiblement les mĂȘmes.

@maranomynet Comptez -vous toujours sur votre script pour déplacer les fichiers de déclaration une fois le rollup

Ouais. cela semble ĂȘtre le seul moyen Ă  moins que vous ne laissiez tsc faire le regroupement de bout en bout.
Ces plug-ins de cumul semblent effectivement demander à tsc d'effectuer deux tùches différentes :

  1. "Tapez et convertissez tous ces modules individuels en JavaScript" et laissez-moi (c'est-Ă -dire Rollup) faire le regroupement et l'Ă©criture sur le disque.
  2. "Faites toutes les déclarations pour ce dossier de projet TS et déposez-les là-bas."

Les rĂ©sultats de 1 et 2 ne correspondent pas et ne peuvent pas correspondre lorsque vous utilisez une « carte d'entrĂ©e » et une division de code, etc. – AFAICT.

... à moins que vous ne rendiez le plug-in de cumul beaucoup plus impliqué dans le processus de génération de déclaration de type.

Ah ouais c'est un peu ce que je pensais, merci ! Je vous ai donnĂ© un 👍 pour votre rĂ©ponse utile, et le 👎 correspond Ă  ce que je ressens Ă  ce sujet.

De la chance avec ça ?

Pour toute Ăąme en difficultĂ© qui a la mĂȘme structure de dossiers src que @maranomynet et moi.

Je suis tombĂ© sur une solution rapide pour cela, peut-ĂȘtre une autre façon laide mais fonctionne pour moi.

J'utilise rollup-plugin/typescript2 donc je vais utiliser sa configuration dans cette réponse :
Définissez votre propre declarationDir dans votre tsconfig.json afin que votre projet puisse vider tous les fichiers *.d.ts dans son propre chemin dans le dist fourni. Et assurez-vous de définir useTsConfigDeclarationDir sur true dans votre plug-in dactylographié dans le fichier de configuration de cumul.
De plus, lorsque vous dĂ©finissez les chemins de sortie de vos ensembles de composants individuels dans votre rollup.config.js (et package.json), modifiez ces chemins pour qu'ils soient les mĂȘmes que votre « declarationDir » + « comment est votre route de composant src ». Donc, si votre composant dans src ressemble à :

src/page d'accueil/foo.tsx

Et votre déclarationDir est :

dist/MyDeclarationDir

Votre chemin de sortie doit donc ressembler à :

dist/MyDeclarationDir/homepage/foo.js

De cette façon, le cumul inclura vos types dans le mĂȘme rĂ©pertoire que votre composant main.js et votre projet consommateur TS rĂ©cupĂ©rera les saisies.

Le bundle ressemblera donc Ă  quelque chose comme :

dist/

    declarationDirPath/
                  component1/
                        foo.js/
                              foo.js
                              foo.map.js
                        foo.d.ts
                   component2/
                        bar.js/
                               bar.js
                               bar.map.js
                        bar.d.ts
Cette page vous a été utile?
0 / 5 - 0 notes