angular - 另一个文件中的模块“AnotherModule”导入了意外的值“文件中的模块”。请添加@NgModule 注释
问题描述
在过去的整整 4 天里,我一直在为这个问题头疼。我想我已经阅读了关于 SO 和谷歌的几乎所有内容。所以也许,这里有人可以帮助我。我有 2 个 angular 11 库,一个核心和另一个称为组件。组件依赖于核心。核心构建完美,--prod
没有错误或警告。
一旦我尝试使用--prod
. 然后我收到一条错误消息,说我的所有核心模块(我有 3 个、CoreModule、DirectivesModule、PipesModule)都有错误。
这三个错误都是一样的:
/Users/eestein/Documents/dev/main/projects/x/components/node_modules/@x/core/lib/core.module.d.ts 模块“FormModule in /Users/eestein”导入的意外值“CoreModule” /Documents/dev/main/projects/x/components/src/lib/form/form.module.ts'。请添加 @NgModule 注释。/Users 中的“FormModule”模块导入的意外值“/Users/eestein/Documents/dev/main/projects/x/components/node_modules/@x/core/lib/directives/directives.module.d.ts”中的“DirectivesModule” /eestein/Documents/dev/main/projects/x/components/src/lib/form/form.module.ts'。请添加 @NgModule 注释。无法绑定到“myDir”,因为它不是“ng-template”的已知属性。
- 如果“myDir”是 Angular 指令,则将“CommonModule”添加到该组件的“@NgModule.imports”中。
- 要允许任何属性,请将“NO_ERRORS_SCHEMA”添加到此组件的“@NgModule.schemas”。("nConfig.isDropdownOpen && !!parentButtonConfig.dropdownComponent"> <ng-template [ERROR ->][myDir]="parentButtonConfig.dropdownComponent" (a") 附加的事件绑定不是由嵌入式模板上的任何指令发出的。确保事件名称拼写正确,并且所有指令都列在“@NgModule.declarations”中。(“[myDir]="parentButtonConfig.dropdownComponent">”)属性绑定 myDir 未被嵌入模板上的任何指令使用。确保属性名称拼写正确并且所有指令都列在“@NgModule.declarations”中。 ("="parentButtonConfig.isDropdownOpen && !!parentButtonConfig.
这是指令模块和一个指令的代码:
@NgModule({
imports: [
CommonModule
],
declarations: [
MyDirDirective
],
exports: [
MyDirDirective
]
})
export class DirectivesModule { }
@Directive({
selector: '[myDir]',
exportAs: 'myDir'
})
export class MyDirDirective
这是我导出所有内容的方式:
+ src
|--- lib
|--+ directives
| |-- index.ts: export * from './public-api';
| |-- public-api.ts:
| | export * from './directives.module';
| | export * from './my-dir.directive';
| |-- directives and module
|--- index.ts: export * from './public-api';
|--- public-api.ts: export * from './directives/index';
这就是我将核心库安装到组件中的方式(组件构建过程的一部分):
npm install file:core.tgz --no-save
只是为了缩小一点:
- 我认为它与桶文件无关,自从我的第一个 angular 2+ lib(2017 年)以来,我总是参考索引文件:
path/inner-path/index
. 但我重新验证了整个代码。 - 我也不认为我在该
imports
部分中导入提供程序或任何不是模块的东西,我不止一次地重新验证了整个代码,以防万一。 - 作为我在这里发布之前尝试的最后一件事,我从我的核心模块(forRoot 方法)中删除了所有内容,它也没有工作(解决方案发布在这里https://codewithstyle.info/creating-angular-npm-packages -with-ng-packagr/ )
使用enableIvy: true
删除错误,但它阻止我发布到 NPM。
更新
我迁移到 v11.2.7 并尝试使用新的组合:
"enableIvy": "true",
"compilationMode": "partial"
这应该允许构建工作。奇怪的是,我仍然得到错误:
ERROR: Trying to publish a package that has been compiled by Ivy. This is not allowed.
如果您需要更多信息,请告诉我。
解决方案
我将此作为答案发布,因此它是可见的,因为它确实“回答”了这个问题。
这与我的导出方式或文件无关。该错误完全具有误导性。该错误甚至没有发生在消息中指出的指令中。另一个指令没有被编译器 ( ng build --prod
) 捕获,发生了循环依赖,这对我来说是超现实的。我不得不在几个不同的地方更改几行代码,以将问题缩小到实际问题。
我正在创建一个回购,所以我可以向 Angular 团队提交一个错误。
很遗憾,第一个构建(有错误的那个)是正确构建的,只有当我尝试构建消费者时,我才收到错误。
无论如何,现在继续。
推荐阅读
- nightwatch.js - 有没有办法从守夜人中执行系统命令?
- awk - 使用 sed 或 awk 将部分字符串替换为变量
- javascript - 如何解决windows和mac之间textarea字段上的不同表情符号
- java - 自定义时间格式方法的问题
- graphene-python - 如何将 NonNull 设置为连接类中的节点和边?
- java - APCSP 创建任务问题 - 方法在被调用后结束程序
- javascript - 滚动到页面或div底部时如何运行函数?
- javascript - 尝试重写已弃用的 jquery 函数 fn.click()
- javascript - VueJS 从另一个方法访问变量
- wordpress - 如何从免费的 getbutton.io 中删除品牌?