如何在分叉库中使用 DefinetelyTyped?

How to use DefinetelyTyped in a forked lib?

我不得不 fork libA 只是为了更新它的一个依赖项。 LibA 本身没有打字稿定义,但在 DefinitelyTyped 中有一个条目。

如何将 DefinitelyTyped 与我的分叉相匹配(因为我的分叉不匹配相同的名称,现在是@myrepo/libA)?

在我使用之前:

import libA, {libAProps} from 'libA';

一个可能的解决方案是保持导入不变,但 "rewrite" 使用 tsconfig.json 中的 paths option 将模块添加到您的分支中。这样 TypeScript 仍将使用 libA 来查找类型定义,但实际代码来自您的 fork。

{
  "compilerOptions": {
    "baseUrl": ".", // This must be specified if "paths" is.
    "paths": {
      "libA": ["node_modules/@myrepo/libA"] // This mapping is relative to "baseUrl"
    }
  }
}

这可能是一个常见问题,我也遇到过。我的解决方案:

我没有更改包名称(或范围),而是将我的分支发布到一个自托管的 npm 注册表:

我正在 运行 本地 Verdaccio,使用 Docker Compose。官方 npm 注册表 registry.npmjs.org 配置为上行链路,因此 Verdaccio 成为透明覆盖层,我可以在本地发布我的分支构建并仍然从官方注册表获取其他包。

因为不需要更改 fork 的包名称,DefinitelyTyped 包仍然有效。

注意解决方案不是最优的:

  1. 额外的维护成本(但可能有更多好处,例如 Verdaccio 充当缓存,加速未来的 npm 安装)
  2. 哪些软件包或软件包版本是本地发布的分支并不十分明显。

关于 2.,我通过手动将自定义预发布版本添加到原始包版本来建立某种解决方案。示例:

  • 原版:1.0.2
  • 分叉版本:1.0.2-sbusch.1

对于我这边需要构建和发布的更多补丁,我将最后一位增加到 1.0.2-sbusch.21.0.2-sbusch.3 等等。由于预发布版本的优先级较低 according to semver.orgnpm outdated(我经常 运行)总是将已安装的分支显示为可用升级。 (注意:1.0.3-sbusch.1 在实践中可以更好地工作,因为它表示 "pre-release of the next official, to-be-released version"。虽然还没有尝试过)

我尝试过的其他解决方案:npm linkyarn linknode_modules 中的符号链接。对他们的体验很差,因为他们跳过了常规 build/publish/install 工作流程,而您使用的是他们的源代码,而不是他们的(转译)构建。

非常感谢任何反馈!