gpt4 book ai didi

javascript - 'package.json' 不在 'rootDir' 之下

转载 作者:搜寻专家 更新时间:2023-10-30 21:13:23 29 4
gpt4 key购买 nike

我正在尝试在我的 TypeScript 应用程序中导入 package.json:

import packageJson from '../package.json';

我的 tsconfig.json 包含以下内容:

{
"compilerOptions": {
"rootDir": "./src/"
"outDir": "./dist/",
"baseUrl": ".",
"resolveJsonModule": true
}
}

问题是当我编译这个的时候,我得到了

error TS6059: File '/path/to/package.json' is not under 'rootDir' '/path/to/app/src/'. 'rootDir' is expected to contain all source files.

我不确定我是否理解这个问题,因为 ./src//.dist 具有相同的父级 .. ,因此 TypeScript 可以不理会 import '../package.json' 并且 它可以从 rootDiroutDir 中工作

无论如何,我已经尝试了以下方法,但结果并不令人满意:

  • 删除 rootDir - 编译有效,但 dist 将包含 dist/src,这是我不想要的
  • 删除 outDir - 然后 src.js 文件(和 .js.map 污染,如果 sourceMap 是真的)
  • 添加 @ts-ignore - 编译停止导入 ../package.json
  • 的文件

此限制的解决方法是什么,将生成的文件保存在 dist 中,并允许从 rootDir 的父目录导入?

最佳答案

这是可能的,事实证明,不难

解决方案不明显的原因是因为 typescript 依赖于 rootDir 来决定输出的目录结构(参见 this comment from Typescript's bossman ),并且只包含代码可以导入输出或包依赖项。

  • 如果将 rootDir 设置为项目的根目录,package.json 将发送到 outDir 的根目录并可以导入。但是随后您编译的 src 文件将写入 outDir/src
  • 如果将rootDir 设置为src,那里的文件将编译到outDir 的根目录。但是现在the compiler won't have a place to emit package.json ,所以它发出“一个错误,因为项目似乎配置错​​误”(老板的话)。

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

Typescript 项目tsconfig 文件定义,是独立的,并且有效地 受其rootDir< 限制。这是一件非常好的事情,因为它符合封装原则

您可以有多个项目(例如,一个主项目和一组库),每个项目都在它们自己的目录中,并且有它们自己的 tsconfig。它们之间的依赖关系使用 Typescript 在 tsconfig 文件中声明 Project References .

I admit, the term "projects" is a poor one, as intuitively it refers to the whole shebang, but "modules" and "packages" are already taken in this context. Think of them as "subprojects" and it will make more sense.

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

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

    ./src/tsconfig.json:

    {
    "compilerOptions": {
    "rootDir": ".",
    "outDir": "../dist/",
    "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.
    ]
    }
  3. 运行 tsc --build src 瞧瞧!

    这将构建src 项目。因为它声明了对根项目的引用,所以它也会构建那个项目,但前提是它已过时。因为根 tsconfig 与 outDir 具有相同的目录,所以 tsc 将不会对 package.json 做任何事情,它被配置为编译的一个文件。

这对 monorepos 非常有用

  • 您可以通过将模块/库/子项目放在它们自己的子目录中并为它们提供自己的 tsconfig 来隔离模块/库/子项目。

  • 您可以使用 Project References 显式管理依赖项,以及模块化构建:

    来自链接文档:

    • 您可以大大缩短构建时间

      A long-awaited feature is smart incremental builds for TypeScript projects. In 3.0 you can use the --buildflag with tsc. This is effectively a new entry point for tsc that behaves more like a build orchestrator than a simple compiler.

      Running tsc --build (tsc -b for short) will do the following:

      • Find all referenced projects
      • Detect if they are up-to-date
      • Build out-of-date projects in the correct order

      Don’t worry about ordering the files you pass on the commandline - tsc will re-order them if needed so that dependencies are always built first.

    • 强制组件之间的逻辑分离

    • 以新的更好的方式组织您的代码。

这也很简单:

  1. 用于共享选项和构建所有内容的根 tsconfig使用简单的 tsc --build 命令创建子项目(使用 --force 从头开始​​构建它们)

    src/tsconfig.json

    {
    "compilerOptions": {
    "outDir": ".", // prevents this tsconfig from compiling any files

    // we want subprojects to inherit these options:
    "target": "ES2019",
    "module": "es2020",
    "strict": true,
    ...
    },

    // configure this project to build all of the following:
    "references": [
    { "path": "./common" }
    { "path": "./projectA" }
    ]
    }
  2. 一个“公共(public)”库被阻止从其他子项目,因为它没有项目引用

    src/common/tsconfig.json

    {
    "extends": "../tsconfig.json", //inherit from root tsconfig

    // but override these:
    "compilerOptions": {
    "rootDir": ".",
    "outDir": "../../build/common",
    "resolveJsonModule": true,
    "composite": true
    }
    }

  3. 一个子项目可以导入 common 因为声明了引用。src/projectA/tsconfig.json

    {
    "extends": "../tsconfig.json", //inherit from root tsconfig

    // but override these:
    "compilerOptions": {
    "rootDir": ".",
    "outDir": "../../build/libA",
    "resolveJsonModule": true,
    "composite": true
    },
    "references": [
    { "path": "../common" }
    ]
    }

关于javascript - 'package.json' 不在 'rootDir' 之下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753163/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com