Angular 9 - 目标入口点缺少依赖项

56

我将一个 Angular 库升级到了 Angular 9。但是,当我尝试在另一个 Angular 9 项目中使用该库时,我会得到以下错误:

目标入口点 "mycomponents/entity-selector" 缺少依赖项:

 - mycomponents/shared-services
 - mycomponents/spinner
 - mycomponents/text-input

包描述文件(Package.json)

{
  "$schema": "../../../node_modules/ng-packagr/package.schema.json",
  "name": "entity-selector",
  "version": "0.0.0",
  "ngPackage": {
    "lib": {
      "entryFile": "public_api.ts"
    },
    "dest": "../../../dist/mycomponents/entity-selector"
  }
}

这是一个使用其他次要终点的次要终点。

在库项目中,我需要在 ng-packgr 中或其他地方定义依赖项吗?实体选择器组件的模块导入了其他组件的适当模块。自 Angular 9 以来,出现了此问题。

提前感谢。


1
你可以发布你的库的package.json文件中相关的部分吗? - Adam Dunkerley
1
@ScottWalter 你找到解决方案了吗?我也遇到了同样的问题。 - Dmitry Grinko
有任何答案了吗? - dendimiiii
目前还没有解决方案。然而,最近这并不是重点,但我需要重新开始处理它。 - Scott Walter
10个回答

30
ERROR in The target entry-point "primeng" has missing dependencies: - chart.js

ERROR in The target entry-point "primeng" has missing dependencies: - quill

ERROR in The target entry-point "primeng" has missing dependencies: - @fullcalendar/core


npm install --save chart.js
npm install --save quill
npm install --save @fullcalendar/core

37
请避免只发布代码的答案。尝试添加有关已粘贴代码的更多信息。 - Eldar
5
升级 Angular 版本会导致依赖项丢失吗? - Balazs F.

19

第一个问题

你收到该错误是因为你的测试项目在node_modules/目录下没有安装那些依赖项。但我认为按照@Renato的建议,强制库的用户手动安装这些依赖项是错误的做法。

为了让缺失的依赖项自动安装,需要在库本身的两个地方(内部)添加你的库的第三方依赖项:必要的

  • 在库的根目录下的package.json文件。我相信你已经完成了这个步骤。将所有软件包放在此处,确保在开发时只有一个根目录下的node_modules/目录。
  • projects/entity-selector/package.json是构建库时 Angular 生成的 package.json 文件的基础文件。必须在此处添加依赖项,以便库的使用者知道他们(好吧,他们的软件包管理器)需要下载哪些软件包。我相信这是你目前缺少的内容。

第二个问题

在适当地将我的依赖项添加到这两个位置后,我收到了构建错误提示,告诉我应该为我的库使用"peerDependencies"而不是"dependencies"。

这对我的用例不适用,所以为了绕过它,我不得不明确地列出我的依赖项。根据你使用的以下哪个选项,做法略有不同

  • projects/entity-selector/package.json
  • projects/entity-selector/ng-package.json


projects/entity-selector/package.json中应该是:

{
  "$schema": "../../../node_modules/ng-packagr/package.schema.json",
  "ngPackage": {
    "lib": {
      "entryFile": "public_api.ts"
    },
    "dest": "../../../dist/mycomponents/entity-selector",
    "whitelistedNonPeerDependencies": [
      "mycomponents/shared-services",
      "mycomponents/spinner",
      "mycomponents/text-input"
    ]
  }
}

projects/entity-selector/ng-package.json 文件中应该是:

{
  "$schema": "./node_modules/ng-packagr/package.schema.json",
  "lib": {
    "entryFile": "public_api.ts"
  },
  "whitelistedNonPeerDependencies": [
    "mycomponents/shared-services",
    "mycomponents/spinner",
    "mycomponents/text-input"
  ]
}
最后,不要忘记使用ng build --prod来构建您的项目,否则当您尝试发布到NPM时,您将收到关于新的Ivy编译器的错误error

让我今天稍后试一下。我们有一个Angular工作区项目,其中包括一个组件库和一个示例应用程序。我正在将组件(辅助终端)定位到dist目录中。此外,我们仅为每个第二终端设置了一个package.json而不是ng-package.json。 - Scott Walter
1
这是真正帮助了我的答案。谢谢! - mmmBacon

8

修改组件项目,将绝对路径更改为相对路径。

例如:

import {xxx} from 'src/xxx/xxx.module';

to:

import {xxx} from '../../xxx/xxx.module';

我通过这个修改解决了我的问题。谢谢! - Walteann Costa
@yang zhou为什么这会解决问题?有什么区别吗? - Ivan Frolov

6

我也遇到了同样的问题。这是在添加符号链接后发生的,所以我不得不使用

npm unlink *@your/package*

或者全局地

npm unlink

1
谢谢。我浪费了将近半天的时间,然后才意识到这是问题所在。@AverageProgrammer - mak15

2

ngx-quill需要已经安装了quill库,所以只需添加以下内容即可解决问题:

npm i quill@^1.3.7


2

我想我刚刚解决了你所描述的情况。我有一个名为my-pkg的NPM包,其中包含多个“库”(使用ng g library lib[1..N]创建等)。碰巧我的libN依赖于lib1。当我尝试在应用程序中使用libN时,我会收到错误消息:

The target entry-point "my-pkg/libN" has missing dependencies:
 - lib1

以下是我最初将lib1导入到libN的方法:

// libN.component.ts
import { Lib1Comp } from 'lib1';

当我构建my-pkg时,这个可以运行。问题是'lib1'在我的应用程序的node_modules文件夹中没有解析为顶级包。在那里,它应该被称为my-pkg/lib1。因此,让我们更改libN.component.ts中的导入:

// libN.component.ts
import { Lib1Comp } from 'my-pkg/lib1'; // note lib1 is now prefixed with my-pkg

当然,我们在my-pkgnode_modules中没有安装my-pkg,所以它无法找到my-pkg/lib1,现在my-pkg不能构建。
但是,如果我们能够将my-pkg“安装”到自己的node_modules文件夹中呢?让我们尝试通过NPM脚本将其复制到其中:
// package.json
...
"scripts": {
    "copy:lib1": "npx copy .\\dist\\lib1\\**\\* .\\node_modules\\my-pkg\\lib1",
    "build:lib1": "ng build --prod lib1 && npm run copy:lib1",
    // repeat copy/build scripts as needed for libs[2..N]
    "build:pkg": "npm run build:lib1 && npm run build:libN"
},

现在,我们运行 npm run build:pkg。它会构建 lib1,然后将其复制到我们本地的 node_modules 文件夹中,现在 libN 可以在你的库和应用程序中愉快地从路径 my-pkg/lib1 导入了!

1
在导入您的库的项目中,将以下内容添加到tsconfig.json中。这可以确保tsc能够解决您的库中子模块之间的“缺少依赖项”问题。
 "compilerOptions": {
    "paths": {
      "mycomponents/*": [
        "./node_modules/mycomponents/*"
      ],

有了这个,就不需要whitelistedNonPeerDependencies了。

0

针对 Angular 和 Primeng 9

错误:目标入口点 "primeng" 缺少以下依赖项:

  • chart.js

我的导入代码如下:

import {ToastModule} from "primeng";

解决方案:

import {ToastModule} from "primeng/toast";

0

当我使用npm run start启动我的Angular项目时,出现了The target entry-point has missing dependencies错误。对我有效的一个简单解决方案是将我的项目从GIT克隆到本地机器上的一个新文件夹中,然后在干净的项目上运行npm installnpm run start。问题就解决了。


0
尝试这个命令:
npm install @azure/msal-browser @azure/msal-angular@latest

对我有效。


请详细解释为什么需要依赖性以及它是如何解决问题的。 - Alexander Mladzhov
请详细解释为什么需要依赖性以及它是如何解决问题的。 - undefined
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接