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.
