如何在本地开发相互依赖的 Angular 7 库?(npm 链接问题)

Pau*_*aul 5 npm npm-link angular angular-library angular7

我有两个角度库 NPM 包:

  • A有基本组件
  • A-BC具有组件时的组件构建一个与附加功能与整合BC

一些组件A-BCA类似导入import { MyThing } from 'A';

A-BC的 package.json 是:

"peerDependencies": {
   "A": 1.0.0,
   "BC": 4.0.0
},
"devDependencies": {
   "A": 1.0.0,
   "BC": 4.0.0
}
Run Code Online (Sandbox Code Playgroud)

我尝试的开发步骤是:

  1. npm link --only=production 在(内置版本) A
  2. npm link --only=production 在(内置版本) A-BC
  3. my-app,运行npm link A
  4. my-app,运行npm link A-BC
  5. my-app

找不到安装在任何地方my-app时编译失败。它们都作为符号链接文件夹正确地排列在彼此的旁边。我已经在启用和尝试过这个,但这没有帮助。A-BCAnode_modulespreserveSymlinkstsconfig.jsonangular.json

A可能是 的直接依赖A-BC,但是:

  • 双方AA-BC有一个forRoot()叫所需的包正常运行为它安装在我不知道的方式来传递的应用程序forRoot()从动态参数A-BC forRoot()A forRoot()
  • my-app需要使用来自AAND 的组件来自A-BC.
  • 如果A是直接依赖,我不知道我怎么会能够发展A-BC本地-这可能涉及改变着A-BC,偶尔A

目前我的创可贴解决方案是:

  1. A作为测试版发布
  2. A-BC和 中安装测试版my-app
  3. 链接A-BCmy-app通过npm link
  4. 发布新的测试版A,如果需要进行更改,然后安装在my-appA-BC

A通过 NPM 对本地文件的支持进行安装可能还有其他工作流程,但我不确定。

Хри*_*тов 3

我假设您正在谈论的这两个包是使用 ngCli v6 创建的,或者您正在从现有的 ng 工作区合并它们,无论哪种方式,让我们尝试解决您的问题。

我假设您有如下所示的 ng 工作区结构

...
projects >
  A
  B
  host
...
Run Code Online (Sandbox Code Playgroud)

其中 A 是一个库 B 是依赖于 A 的库,主机是使用 B 的应用程序。

当在 ng 工作区本地工作/开发 ng 包时,您应该将它们的别名添加到您的root tsconfig.json文件中,例如:

...
projects >
  A
  B
  host
...
Run Code Online (Sandbox Code Playgroud)

当使用命令生成库时,CLI v7 中会自动完成此操作ng new lib {yourLibName}

确保您拥有此配置后,我建议向您的 中添加一些脚本package.json,以便构建您的库并以更直接的方式为您的开发应用程序提供服务(host在示例中)

"build:a": "ng build A --watch=true",
"build:b": "ng build B --watch=true",
"serve:host": "ng serve host"
Run Code Online (Sandbox Code Playgroud)

之后,通过依次运行这三个脚本并从您的文件中导入适当的脚本libModules以及lib BHost App内部导入适当的libModules脚本lib ALib B您将能够使用 的组件lib B,这些组件依赖于lib A内部的组件Host APP

请记住,您不能在工作区中安装这两个库,因为这会破坏项目内的导入,而且这些库也不应该是您工作区的一部分package.json

如果您已完成上述步骤,但问题仍未解决,请向我们提供 git 存储库的链接,或分享您的tsconfig.json, package.json,angular.json文件,以便我们继续调查。

回复子评论

因此,如果我收到您的案例,您希望能够开发这些packages 并将它们安装在一个 ng 工作区中。

如果是这种情况,据我所知,没有直接的方法可以做到这一点,也许您将能够通过调整您的tsconfig.json

但在我看来,如果你想ng packages在同一个工作空间内使用它,你不一定需要推动它们,因为最终它们只是另一组ngModules将成为工作空间内的“一等公民”的人。您向其推荐的应用程序。因此,在为生产而构建时,它们将被进行 tree-shaking、最小化优化等。在这种情况下,您应该只扩展 中的部署脚本package.json,以便在开始构建依赖于这些的主应用程序之前npm/ng/packages构建该包。

"deploy": "ng build A && ng build B && ng build MainApp --production"
Run Code Online (Sandbox Code Playgroud)

同时,这些内容npm/ng/packages仍然可以npm发布,并且您将能够在其他工作区中使用它们。 请记住,它们不应属于同一工作区(正在开发它们的工作区)工作区package.json依赖项的一部分。