Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ';package.json';不在';rootDir';_Javascript_Typescript - Fatal编程技术网

Javascript ';package.json';不在';rootDir';

Javascript ';package.json';不在';rootDir';,javascript,typescript,Javascript,Typescript,我正在尝试在我的TypeScript应用程序中导入package.json: import packageJson from '../package.json'; Mytsconfig.json包含以下内容: { "compilerOptions": { "rootDir": "./src/" "outDir": "./dist/", "baseUrl": ".", "resolveJsonModule": true } } 问题是当我编译这个时,我得

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

import packageJson from '../package.json';
My
tsconfig.json
包含以下内容:

{
  "compilerOptions": {
    "rootDir": "./src/"
    "outDir": "./dist/",
    "baseUrl": ".",
    "resolveJsonModule": true
  }
}
问题是当我编译这个时,我得到

错误TS6059:文件“/path/to/package.json”不在“rootDir”/path/to/app/src/”下rootDir'应包含所有源文件。

我不确定我是否理解这个问题,因为
/src/
/.dist
都有相同的父级
,所以TypeScript可以不使用
import'../package.json'
它可以从
rootDir
outDir
工作

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

  • 删除
    rootDir
    -编译工作正常,但是
    dist
    将包含
    dist/src
    ,这是我不想要的
  • 删除
    outDir
    -然后
    src
    .js
    文件污染(如果
    sourceMap
    为true,则
    .js.map
  • add
    @ts ignore
    -编译停止导入
    。/package.json的文件

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

这取决于您阅读“package.json”的方式和时间。您可以在运行时使用NodeJS“fs”模块将其读取为文件,或者只需键入const package=require(“package.json”)

在第二种情况下,Typescript将在编译时在根目录中搜索它(请参阅文档)


您还可以使用“rootDirs”属性而不是“rootDir”来指定根文件夹的数组。

目前还不可能。Typescript编译器尝试保持您的目录结构

例如,您的项目看起来像:

src/
  shared/
    index.ts
  index.ts
package.json
tsconfig.json
build/
  shared/
    index.js
  index.js
...
const shared_1 = __importDefault(require("./shared"));
...
您的
tsconfig.json
包含:

{
  "compilerOptions": {
    "outDir": "./build",
    "module": "commonjs",
    "target": "es6",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "noImplicitAny": true,
    "sourceMap": true,
    "resolveJsonModule": true,
    "esModuleInterop": true
  },
  "include": [
    "src/**/*"
  ]
}
如您所见,该文件不包括
rootDir
属性,但当您调用
tsc
命令编译项目时,输出将如下所示:

src/
  shared/
    index.ts
  index.ts
package.json
tsconfig.json
build/
  shared/
    index.js
  index.js
...
const shared_1 = __importDefault(require("./shared"));
...
输出不包含
src
文件夹,因为在我的代码中,我只是在
src
文件夹中导入和使用,如:

src/index.ts

import someName from './shared';
然后,
build/index.js
将如下所示:

src/
  shared/
    index.ts
  index.ts
package.json
tsconfig.json
build/
  shared/
    index.js
  index.js
...
const shared_1 = __importDefault(require("./shared"));
...
正如您所看到的-
require(“./shared”)
,这意味着它可以很好地使用
构建
文件夹结构

导入“外部”模块时会出现“问题”

那么,“后退”操作-“../”会发生什么?如果您希望您的输出结构是:

build/
  package.json
  index.js
那么,它们如何处理
const-packageJson=\uu-importDefault(require(“../package.json”)。然后,Typescript编译器尝试保持项目结构:

build/
  package.json
  src/
    index.js
app\
└─ dist\
   ├─ index.d.ts
   └─ index.js
对于monorepo项目,我认为您需要为每个库创建声明文件,然后在tsconfig文件中使用
references
设置。例:

  • /lib01
    文件夹中,lib导入
    /lib02
    到它们的代码中。Tsconfig文件如下所示:
  • lib02的
    tsconfig.json

  • 我们可以将
    resolveJsonModule
    设置为false,并在
    typings.d.ts
    中为
    *.json
    声明一个模块,该模块将需要json文件作为模块,并且它将生成
    dist
    目录中没有任何目录结构的文件

    Monorepo目录结构
    app/typings.d.ts
    声明模块“*.json”;
    
    app/src/index.ts
    //从app/package.json导入
    从“../package.json”导入appPackageJson;
    //从lib/package.json导入
    从“../../lib/package.json”导入libPackageJson;
    导出函数run():void{
    log(`App name“${appPackageJson.name}”,版本为${appPackageJson.version}`);
    log(`Lib name“${libPackageJson.name}”,版本为${libPackageJson.version}`);
    }
    run();
    
    app/package.json
    contents
    {
    “名称”:“我的应用程序”,
    “版本”:“0.0.1”,
    ...
    }
    
    lib/package.json
    contents
    {
    “名称”:“我的图书馆”,
    “版本”:“1.0.1”,
    ...
    }
    
    现在,如果我们使用
    tsc
    编译项目,我们将得到以下
    dist
    目录结构:

    build/
      package.json
      src/
        index.js
    
    app\
    └─ dist\
       ├─ index.d.ts
       └─ index.js
    
    如果我们使用
    node./dist
    运行它,我们将从
    app
    lib
    package.json
    获取输出信息:

    $ node ./dist
    App name "my-app" with version 0.0.1
    Lib name "my-lib" with version 1.0.1
    

    您可以在这里找到项目存储库:

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

    解决方案不明显的原因是,typescript依赖于
    rootDir
    来决定输出的目录结构(请参阅),并且只能导入输出或包依赖项中包含的代码

    • 如果将
      rootDir
      设置为项目的根目录,
      package.json
      将被发送到
      outDir
      的根目录,并且可以导入。但是,编译后的
      src
      文件会写入
      outDir/src
    • 如果将
      rootDir
      设置为
      src
      ,则其中的文件将编译为
      outDir
      的根目录。但现在,它发出了“一个错误,因为项目似乎被错误配置了”(博斯曼的话)
    解决方案:使用单独的Typescript子项目 Typescript项目由tsconfig文件定义,是自包含的,并且有效地受其
    rootDir
    的约束。这是一件非常好的事情,因为它符合封装原则

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

    我承认,术语“项目”是一个差劲的词,因为从直觉上看,它指的是整个shebang,但是“模块”和“包”已经在这个上下文中出现了。把他们想象成“一个女人”
        {
          "compilerOptions": {
            "rootDir": ".",
            "outDir": "../../build/libA",
            "resolveJsonModule": true,
            "composite": true
          },
          "references": [
            { "path": "../common" }
          ]
        }
    
    cd src
    mklink package.json ..\package.json
    
    cd src
    ln -s package.json ../package.json