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

Tyl*_*son 6 json typescript package.json

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

我的包有以下文件:

src/
  index.ts
package.json
tsconfig.json
Run Code Online (Sandbox Code Playgroud)

我的 index.ts 导入 package.json:

import pkg = require("../package.json");
Run Code Online (Sandbox Code Playgroud)

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

{
  "compilerOptions": {
    "outDir": "./lib",
    "module": "commonjs",
    "resolveJsonModule": true,
    "esModuleInterop": true
  },
  "include": [
    "src/**/*"
  ]
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,结果是:

lib/
  index.js
package.json
Run Code Online (Sandbox Code Playgroud)

但是我实际得到的是:

lib/
  src/
    index.js
  package.json
package.json
Run Code Online (Sandbox Code Playgroud)

Dom*_*nik 8

我正在使用 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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我只是像这样导入它:

{
  "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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你的目标模块系统是“commonjs”,它就可以工作。但是,如果您的“模块”是“ES6”/“ESNext”,它将产生包含 CommonJS require 表达式的无效 ESM 输出。 (3认同)

vas*_*vas 6

你想要一些有些矛盾的东西:

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

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

\n

如果您按逻辑将项目分解为单独的子项目,那么这些矛盾就不再是矛盾。您将需要 Typescript 3 的新项目引用功能。

\n

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

\n
    \n
  1. 为该src目录提供自己的项目。

    \n

    ./src/tsconfig.json:

    \n
     {\n   "compilerOptions": {\n     "rootDir": ".",\n     "outDir": "../lib/",\n     "resolveJsonModule": true\n   },\n   "references": [      // this is how we declare a dependency from\n     { "path": "../" }  // this project to the one at the root dir`\n   ]\n }\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 为根目录提供自己的项目。

    \n

    ./tsconfig.json:

    \n
     {\n   "compilerOptions": {\n     "rootDir": ".",\n     "outDir": ".",  // if out path for a file is same as its src path, nothing will be emitted\n     "resolveJsonModule": true,\n     "composite": true  // required on the dependency project for references to work\n   },\n   "files": [         // by whitelisting the files to include, TS won\'t automatically\n     "package.json"   // include all source below root, which is the default.\n   ]\n }\n
    Run Code Online (Sandbox Code Playgroud)\n

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

    \n
  4. \n
  5. 跑步tsc --build src并破坏\xc3\xa0!结果将是:

    \n
     lib/\n   index.js\n package.json\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
\n


bas*_*rat 1

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

如果您的 src 文件结构lib始终是直接副本。如果您包含package.json到 TypeScript 编译上下文中,那么它会将您的 lib 更改为package.json + src.

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

如果你导入的话就不能。

选择

两个项目,如本答案所述:https ://stackoverflow.com/a/61468012/390330