¿Cómo importar package.json en un archivo de Typescript sin incluirlo en el resultado compilado?
Usando TypeScript 2.9, puedo importar con éxito el archivo package.json local y usar los valores. Sin embargo, ahora tengo el problema de que el archivo package.json se incluye en el resultado compilado, cuando solo quiero que los archivos JS resultantes utilicen el package.json real.
Mi paquete tiene los siguientes archivos:
src/
index.ts
package.json
tsconfig.json
Mi index.ts importa el package.json:
import pkg = require("../package.json");
Mi tsconfig.json se ve así:
{
"compilerOptions": {
"outDir": "./lib",
"module": "commonjs",
"resolveJsonModule": true,
"esModuleInterop": true
},
"include": [
"src/**/*"
]
}
Idealmente, el resultado sería:
lib/
index.js
package.json
Sin embargo, lo que realmente obtengo es:
lib/
src/
index.js
package.json
package.json
Respuesta #1
🚩 Este enfoque no funcionará para destinos ESM. Si estás intentando crear un Módulo ES6, tendrás que usar una solución diferente.
Estoy usando TypeScript 3.5.1 y si importo el package.json con la función require(), entonces no se copia al resultado de compilación, por lo que el resultado se ve como tu resultado ideal.
Mi tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"lib": ["es2015", "dom"],
"sourceMap": true,
"strict": true,
"moduleResolution": "node",
"downlevelIteration": true
"outDir": "./ts-out",
"noImplicitAny": false,
"suppressImplicitAnyIndexErrors": false
},
"include": [
"./src"
]
}
Y simplemente lo importo así:
const pkg = require('../package.json');
He encontrado esta solución en el código fuente del framework Jest de Facebook (ellos están usando Lerna + TypeScript): https://github.com/facebook/jest/blob/master/packages/jest-core/src/version.ts
Respuesta #2
Quieres algunas cosas algo contradictorias:
- Quieres importar
package.json, lo que significa que lo estás tratando como fuente - Pero no quieres que se compile/emita al
outDircomo se hace con el código fuente - No quieres que la ruta de salida dentro de outDir incluya "src/", lo cual sucede cuando haces que
rootDirapunte a la raíz del proyecto en lugar de a la raíz desrc, que es la única manera de que la declaración de importación funcione.
solución: usar subproyectos de Typescript separados
Estas contradicciones no serán contradicciones si desglosas lógicamente tu proyecto en subproyectos separados. Necesitarás la nueva función de Referencias de Proyecto de Typescript 3.
Trataremos el directorio src y el directorio raíz que contiene package.json como proyectos separados. Cada uno tendrá su propio archivo tsconfig:
Dale al directorio
srcsu propio proyecto../src/tsconfig.json:{ "compilerOptions": { "rootDir": ".", "outDir": "../lib/", "resolveJsonModule": true }, "references": [ // this is how we declare a dependency from { "path": "../" } // this project to the one at the root dir` ] }Dale al directorio raíz su propio proyecto.
./tsconfig.json:{ "compilerOptions": { "rootDir": ".", "outDir": ".", // if out path for a file is same as its src path, nothing will be emitted "resolveJsonModule": true, "composite": true // required on the dependency project for references to work }, "files": [ // by whitelisting the files to include, TS won't automatically "package.json" // include all source below root, which is the default. ] }Porque para la salida del subproyecto raíz es el mismo directorio, y porque la ruta de origen y la ruta de salida para
package.jsonterminan siendo las mismas,tscno hará nada... efectivamente un no-op.ejecute
tsc --build srcy ¡voilà! El resultado será:lib/ index.js package.json
