Búsqueda de sitios web

¿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:

  1. Quieres importar package.json, lo que significa que lo estás tratando como fuente
  2. Pero no quieres que se compile/emita al outDir como se hace con el código fuente
  3. No quieres que la ruta de salida dentro de outDir incluya "src/", lo cual sucede cuando haces que rootDir apunte a la raíz del proyecto en lugar de a la raíz de src, 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:

  1. Dale al directorio src su 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`
       ]
     }
    
  2. 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.json terminan siendo las mismas, tsc no hará nada... efectivamente un no-op.

  3. ejecute tsc --build src y ¡voilà! El resultado será:

     lib/
       index.js
     package.json
    

Artículos relacionados