- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的用例如下:
子库代码
import { NgModule } from '@angular/core';
import {CommonModule} from "@angular/common";
@NgModule({
imports: [CommonModule],
declarations: [
SampleDirective
],
exports: [
SampleDirective
]
})
export class ChildModule { }
子库中指令的代码
import {Directive, PLATFORM_ID, Inject} from '@angular/core';
@Directive({
selector: '.sample'
})
export class SampleDirective {
constructor(@Inject(PLATFORM_ID) private _element: Object) {
}
}
在父模块中我安装了子模块并且我正在做下面的简单单元测试
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
import {Component} from '@angular/core';
import {ChildModule} from "@nz/child-lib";
@Component({
selector: 'nz-host',
template: `
<div class="sample"></div>
`
})
export class TestWrapperComponent{}
describe('injection problem', () => {
let testFixture: ComponentFixture<TestWrapperComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [TestWrapperComponent],
imports: [ChildModule]
});
}));
beforeEach(async(() => {
testFixture = TestBed.createComponent(TestWrapperComponent);
testFixture.detectChanges();
}));
it('test', () => {
expect(true).toBe(true);
});
});
当我运行测试时,出现以下错误:
StaticInjectorError[InjectionToken Platform ID]: NullInjectorError: No provider for InjectionToken Platform ID! Error: StaticInjectorError[InjectionToken Platform ID]: at _NullInjector.get (webpack:///node_modules/@angular/core/esm5/core.js:923:0 <- spec.bundle.js:3517:19) at resolveToken (webpack:///node_modules/@angular/core/esm5/core.js:1211:0 <- spec.bundle.js:3805:24) at tryResolveToken (webpack:///node_modules/@angular/core/esm5/core.js:1153:0 <- spec.bundle.js:3747:16) at StaticInjector.get (webpack:///node_modules/@angular/core/esm5/core.js:1024:0 <- spec.bundle.js:3618:20) at resolveToken (webpack:///node_modules/@angular/core/esm5/core.js:1211:0 <- spec.bundle.js:3805:24) at tryResolveToken (webpack:///node_modules/@angular/core/esm5/core.js:1153:0 <- spec.bundle.js:3747:16) at StaticInjector.get (webpack:///node_modules/@angular/core/esm5/core.js:1024:0 <- spec.bundle.js:3618:20) at resolveNgModuleDep (webpack:///node_modules/@angular/core/esm5/core.js:10584:0 <- spec.bundle.js:13178:25) at NgModuleRef_.get (webpack:///node_modules/@angular/core/esm5/core.js:11805:0 <- spec.bundle.js:14399:16) at resolveDep (webpack:///node_modules/@angular/core/esm5/core.js:12301:0 <- spec.bundle.js:14895:45)
我的 package.json 是这样的:
"dependencies": {
"tslib": "^1.7.1"
},
"peerDependencies": {
"@angular/common": ">= 5.0.0",
"@angular/core": ">= 5.0.0"
},
"devDependencies": {
"@angular/animations": "5.0.0",
"@angular/common": "5.0.0",
"@angular/compiler": "5.0.0",
"@angular/compiler-cli": "5.0.0",
"@angular/core": "5.0.0",
"@angular/platform-browser": "5.0.0",
"@angular/platform-browser-dynamic": "5.0.0",
"@angular/platform-server": "5.0.0",
"@compodoc/compodoc": "1.0.3",
"@nz/child-lib": "^0.0.1",
"@types/jasmine": "2.6.2",
"@types/node": "8.0.47",
"chalk": "2.3.0",
"codelyzer": "4.0.2",
"core-js": "2.5.1",
"istanbul-instrumenter-loader": "3.0.0",
"jasmine-core": "2.8.0",
"karma": "1.7.1",
"karma-chrome-launcher": "2.2.0",
"karma-coverage-istanbul-reporter": "1.3.0",
"karma-jasmine": "1.1.0",
"karma-sourcemap-loader": "0.3.7",
"karma-spec-reporter": "0.0.31",
"karma-webpack": "2.0.5",
"reflect-metadata": "0.1.10",
"rollup": "0.50.0",
"rollup-plugin-license": "0.5.0",
"rollup-plugin-node-resolve": "3.0.0",
"rollup-plugin-sourcemaps": "0.4.2",
"rxjs": "5.5.2",
"shelljs": "0.7.8",
"source-map-loader": "0.2.3",
"ts-loader": "3.1.1",
"tslint": "5.8.0",
"tslint-angular": "1.0.0",
"typescript": "2.4.2",
"uglify-js": "3.1.6",
"webpack": "3.8.1",
"zone.js": "0.8.18"
}
即使在使用以下代码模拟 PLATFORM_ID 时也是如此
{provide: PLATFORM_ID, useValue: 'browser'}
错误仍然存在。
作为符号链接(symbolic link)的包
我有一个新的理论,为什么它会发生在我这边。我想因为我正在使用 lerna 来管理我的包和包依赖性。并且由于我通过 lerna 将子模块添加到主机模块,然后 lerna 在主机的节点模块中创建子模块的符号链接(symbolic link)。所以我的理论是,当我们使用的库是符号链接(symbolic link)时,DI 无法识别他需要注入(inject)什么。试图找出如何使用 --preserve-symlinks 运行测试
非常感谢
最佳答案
所以问题确实是符号链接(symbolic link)。在您的 node_modules 中使用符号链接(symbolic link)或使用像 lerna 这样的包管理工具(它使用符号链接(symbolic link)链接内部包)时。比 Angular 不知道如何正确注入(inject)项目。
我的解决方案是在运行测试之前删除符号链接(symbolic link),使用硬拷贝安装包,然后运行测试。
关于Angular 5 和 lerna NullInjectorError : No provider for InjectionToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48639549/
要旨 我有一个 monorepo,我正在使用 yarn workspaces和 lerna来管理它。直到现在我都没有问题。我需要知道自上次发布以来所有更改的包。 问题 所以我跑 lerna chang
我正在尝试使用 Lerna 设置我的 monorepo。该计划是通过提取应该是他们自己的包的代码块来重构现有项目。我跑了lerna init ,我当前的设置如下所示: project/ packa
我有一个 Lerna 项目,直到最近才使用 lerna bootstrap --hoist。这很有效,但我发现许多子文件夹中的 devDependencies 大部分是相同的。升级到 Lerna v3
我有三个包: A , 取决于 C B , 取决于 C C 使用 lerna run build 时, C在 A 之前构建和 B (好的!) 但是当我开始监视任务时lerna run watch , C
我们正在迁移我们的 monorepo 以使用 Lerna . Lerna 支持 NPM 和 Yarn,此外还允许使用 Yarn 工作区进行配置。我不清楚带有 Yarn 工作区的 Lerna 是否比带有
我正在迁移到 pnpm 以管理来自 lerna 的 monorepo。但是,在 CI 中,有一个遗留命令使用 lerna 的 --since 选项。 lerna run lint --since or
我在 lerna 包下有 2 个项目。其中一个是一个包,另一个是一个cra网站。当我在每个包下执行“yarn start”时,我可以看到构建文件夹和分别在开发服务器中加载的网站: 包 1 >> "st
在我的 monorepo 中,我有 3 个包 package1 , package2 , package3 ,每个包都包含一个名为 build 的 npm 脚本. 但是,这些包没有链接在一起。即没有r
我的结构如下: 包.json lerna.json 包 myproj-util 包.json myproj-模式 package.json -- 在 myproj-util 上有开发依赖 这两个项目都
我有一个由 Lerna 驱动的 monorepo,其中包含发布到 NPM 的各种包。其中有各种辅助函数,它们位于 repo 的根目录中,并由几个包共享。 我遇到的问题是,当每个包都是用 Babel 构
对于 yarn workspaces,我有一个常见(或不那么 coomon)的场景并没有在网上找到适合我的指南。 yarn 工作区看起来像这样: - monorepo - packages
我的根目录中有一个 webpack.config.js (在包含 packages*.json 文件的目录之外),当我启动 lerna 时运行 build 然后出现此错误: **ERROR OUTPU
我正在使用 lerna 来管理 React 组件库。我的一些组件既有来自 npm 注册表的外部依赖项,也有内部依赖项,存储库中的同级包。 我正在尝试使用 lerna add 命令将内部依赖项添加到另一
使用 lerna 和本地依赖项的正确方法是什么? 我已经在 mono 存储库中配置了两个模块,以将 lerna 与本地依赖项一起使用。我预料到了 $ lerna bootstrap $ lerna r
我有一个 lerna 存储库,其中包含以通常结构组织的多个包: package.json /packages - alpha package.json - bravo pack
假设两个项目(例如 my-app 和 my-ui)使用 webpack 别名将“components”解析为“./src/components”。我使用 Lerna 在本地“链接”这个项目并简化开发,
当使用 lerna publish 发布包时,如果检测到循环依赖,则会输出警告。 有没有办法让 lerna 检查循环依赖而不发布包? 最佳答案 lerna bootstrap 也会输出循环依赖。 关于
我有一个 lerna 脚本( lerna dev ),它使用 --parallel 启动几个包的开发服务器选项(如果我不使用该选项,则只会启动第一个服务,而不会启动其他服务)。这些服务器在不同端口上以
我正在使用 Lerna monorepo。我经常看到一个包从另一个包的深处导入,例如: import { SomeType } from "@schema/folder/folder/file.ts"
我有一个预先存在的项目,我想将其导入到我现有的使用 yarn 工作区的 lerna monorepo 中。 命令: I've tried running all of the following co
我是一名优秀的程序员,十分优秀!