如何将package.json导入Typescript文件而不将其包含在编译输出中?

时间:2018-06-27 19:30:31

标签: json typescript package.json

使用打字稿2.9,我能够成功导入本地package.json文件并使用这些值。但是,当我只希望生成的JS文件使用实际的package.json时,我现在遇到了将package.json文件包含在编译输出中的问题。

我的包裹中包含以下文件:

src/
  index.ts
package.json
tsconfig.json

我的index.ts导入package.json:

import pkg = require("../package.json");

我的tsconfig.json看起来像这样:

{
  "compilerOptions": {
    "outDir": "./lib",
    "module": "commonjs",
    "resolveJsonModule": true,
    "esModuleInterop": true
  },
  "include": [
    "src/**/*"
  ]
}

理想情况下,结果将是:

lib/
  index.js
package.json

但是我实际上得到的是:

lib/
  src/
    index.js
  package.json
package.json

5 个答案:

答案 0 :(得分:2)

我正在使用TypeScript 3.5.1,如果我使用require()函数导入package.json,则不会将其复制到编译输出中,因此输出看起来像是理想的结果。

我的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"
  ]
}

我只是这样导入它:

const pkg = require('../package.json');

我已经在Facebook的Jest框架源代码(他们正在使用Lerna + TypeScript)中找到此解决方案:https://github.com/facebook/jest/blob/master/packages/jest-core/src/version.ts

答案 1 :(得分:1)

  

当我只希望生成的JS文件使用实际的package.json时。

如果您的src文件的结构是

您的lib始终是纯文本。如果将package.json包含在TypeScript编译上下文中,则它将把lib更改为package.json + src

  

如何将package.json导入Typescript文件而不将其包含在编译输出中?

如果导入,则不能。

答案 2 :(得分:1)

您想要一些矛盾的事情:

  1. 您要导入package.json,这意味着您将其视为源
  2. 但是您不希望像源代码一样将其编译/发送到outDir
  3. 您不希望outDir中的输出路径包含“ src /”,这是当您将rootDir指向根目录时发生的情况,这是使import语句起作用的唯一方法。 / li>

解决方案:使用单独的Typescript子项目

如果您在逻辑上将您的项目分解为单独的子项目,那么这些矛盾就不会矛盾。您将需要Typescript 3的新Project References功能。

我们将src目录和包含package.json的根目录视为单独的项目。每个文件都有自己的tsconfig文件:

  1. src目录提供给自己的项目。

    ./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. 给根目录自己的项目。

    ./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.
      ]
    }
    

    由于根子项目的输出是相同目录,并且由于package.json的源路径和输出路径最终相同,所以tsc不会做任何事情... 。实际上是无人操作。

  3. 运行tsc --build src,瞧瞧!结果将是:

    lib/
      index.js
    package.json
    

答案 3 :(得分:0)

rootDir内设置tsconfig选项,如下所示

"compilerOptions": {    
    "rootDir": "./src"         
}`

答案 4 :(得分:0)

指定 compilerOptions.moduleResolutioncompilerOptions.resolveJsonModuleinclude,如下所示。

{
  "compilerOptions": {
    // ...
    "moduleResolution": "node",
    "resolveJsonModule": true
    // ...
  },
  "include": [
    "./src",
    "package.json"
  ]
}

然后在 tsconfig.json 文件所在的文件夹中运行 $ tsc -b,假设 package.json 文件与 tsconfig.json 位于同一路径