我有一个monorepo设置有两个包。一个是主应用程序,我们称之为app
,另一个是主应用程序使用的共享库,我们称之为lib
。两者都是TypeScript / Angular项目。
我的文件夹结构如下所示:
monorepo/
packages/
app/
lib/
我正在尝试配置app
项目,以便当它从lib
包中看到导入时,而不是转到node_modules
我希望它转到输出目录构建lib
包。所以我有tsconfig.json
:
{
"compilerOptions": {
"baseUrl": ".",
"rootDir": ".",
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es7", "dom"],
"mapRoot": "./",
"module": "es2015",
"moduleResolution": "node",
"outDir": "../dist/out-tsc",
"sourceMap": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"paths": {
"lib/*": ["../lib/dist/*"]
}
}
但是,当我尝试在ng build
文件夹中运行app
时,我收到以下错误消息(同一错误两次,来自两个不同的位置):
ERROR in node_modules/@angular/core/src/render3/ng_dev_mode.d.ts(9,11): error TS2451: Cannot redeclare block-scoped variable 'ngDevMode'.
../lib/node_modules/@angular/core/src/render3/ng_dev_mode.d.ts(9,11): error TS2451: Cannot redeclare block-scoped variable 'ngDevMode'.
它试图加载Angular两次,一次来自app
目录,另一次来自lib
目录。
答案 0 :(得分:0)
正如您所建议的,它确实试图两次加载角度。 有两种解决方案:
解决方案1 :强制使用应用程序中定义的角度版本。在应用程序的tsconfig.json中的“路径”属性中,添加以下行。它将强制使用位于应用程序的node_modules中的angular lib(根据您的项目调整相对路径)
"paths": {
...
"@angular: ["../node_modules/@angular"],
...
解决方案2 :在您的应用中创建一个指向库的符号链接。
my-lib-folder\dist\my-lib
内npm install ..\my-lib-folder\dist\my-lib
。这将在应用程序的node_modules中创建一个指向您的lib dist的符号链接。"paths": {
...
"my-lib": ["dist.my-lib"]
...
在两种情况下,请检查您的进口商品:
OK : import {MyLibModule} from 'my-lib/';
NOK : import {MyLibModule} from '../my-lib-folder/my-lib/...';
在后一种情况下,仍然会从导入位置相对加载角度版本。