Javascript ';package.json';不在';rootDir';
我正在尝试在我的TypeScript应用程序中导入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 } } 问题是当我编译这个时,我得
package.json
:
import packageJson from '../package.json';
Mytsconfig.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
为true,则sourceMap
).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