node.js - Hvordan fjerne output-mappen fra import-setningene for brukerne av pakken min?


Jeg har et Typescript-basert prosjekt med flere .d.ts-filer som jeg ønsker å eksportere som npm-pakke og bruke i et annet prosjekt.

I det andre prosjektet vil jeg kunne kalle:

import {Foo} from "@my-company/project-name/x/y/Foo"

Prosjektstrukturen min ser slik ut:

<project_root>
|_ node_modules
|_ src
|  |_ x
|     |_ y
|     |  |_ Foo.ts
|     |_ Bar.ts
|_ package.json
|_ tsconfig.json

Min tsconfig.json-fil:

{
  "compilerOptions": {
    "module": "es2015",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "declaration": true
  },
  "lib": ["es2015"],
  "include": [
    "src"
  ],
  "exclude": [
    "node_modules"
  ]
}

Resultatet av å kjøre tsc er at en dist-mappe opprettes som inneholder d.ts-filene og .js-filene. Når man kjører npm pack, ender jeg opp med en .tgz-fil som inneholder følgende struktur.

Merk at det inkluderer dist-mappen i katalogstrukturen.

package
 |_ dist
 |  |_...
 |_ package.json

Resultatet er at jeg ikke kan skrive

import {Foo} from "@my-company/project-name/x/y/Foo"

men må skrive

import {Foo} from "@my-company/project-name/dist/x/y/Foo"

i stedet (merk det ekstra dist i banen).

Basert på dokumentasjonen for Node, trodde jeg at jeg kunne fikse dette ved å legge til følgende i min package.json-fil:

  "exports": {
    "./": "./dist/"
  }

men det ser ut til å ikke ha noen effekt i det hele tatt. Importen kan ikke finnes, med mindre jeg legger til den ekstra dist i banen.

Jeg fant mange andre innlegg, alle med:

  • Løsninger som ser veldig kompliserte ut eller er knyttet til et spesifikt byggesystem
  • Løsninger som håndhever spesielle steg på brukerne av pakken min (som å bruke kompilatoralternativer)
  • Løsninger/forslag i lukkede Github-saker (lukket != fikset)
  • Gamle (over 2 internettår) innlegg, sannsynligvis fra før exports-valget var tilgjengelig.

Jeg vil helst bare få den exports-valgmuligheten til å fungere. Er det noen som har en idé om hva jeg mangler i oppsettet mitt eller gjør galt? Jeg er veldig ny innen hele JS/TS/npm-økosystemet, så jeg tror jeg kan overse noe som er åpenbart for erfarne.

Foreløpig er løsningen jeg har funnet å manuelt gjenopprette tgz-filen og fjerne dist-mappen fra mappestrukturen. Men det føles langt fra perfekt. For eksempel vil npm install link_to_git_repo ikke fungere.

Svar #1

Å konfigurere typesVersions i package.json løser dette problemet for meg :

  "exports": {
    "./": "./dist/"
  },
  "typesVersions": {
    "*": {
      "*": ["./dist/*"]
    }
  },

Svar #2

Det ser ikke ut til å være mulig å bruke kun package.json rett ut av boksen (se denne saken på npm). En foreslått løsning er å npm publish fra dist-mappen direkte. Dette kan enkelt automatiseres med noen få skript, men det fungerer bare når man publiserer til npm, ikke når man importerer ved å bruke git-URLer.

Relaterte artikler