2

大多数 Atlaskit 编辑器都获得 MIT 或 Apache 2.0 许可。我试图弄清楚应该如何使用 Atlaskit,而不接受用于包的非免费(如自由)Atlassian 设计指南许可证(ADG 许可证),它是Atlaskit@atlaskit/icon编辑器深度嵌套依赖项的一部分.@atlaskit/icon-file-type@atlaskit/icon-object

我完全意识到我需要重新创建替代图标和主题,我对此很好。但是,当我创建package.json并运行npm install时,当我包含以下依赖项时,我会获得上述 ADG 许可包:

...
"dependencies": {
    "@atlaskit/editor-core": "^120",
    "@atlaskit/media-core": "^31",
    "@atlaskit/smart-card": "^13",
    ...

我怎样才能通过我自己的实现来使用,例如,而不是@atlaskit/icon从 npmjs.com 获得 ADG 许可的默认值?

分叉整个 Atlaskit 包树只是为了修改依赖项以覆盖这 3 个包显然是可能的,但有更好的方法吗?似乎npm-force-resolutions可以做这样的事情,但据我所知,它只允许替换依赖版本号,所以我可以简单地选择我想要使用官方实现,@atlaskit/icon但不允许更改完全不同的实现。所有版本都@atlaskit/icon具有相同的许可证,我正在尝试这样做,因为我不喜欢 ADG 许可证,我愿意重新实现所需的部分。

我更喜欢可以保存在需要其他依赖项的主级别package.json(或旁边的文件)中的东西。atlaskit我正在使用节点 v12,以防万一。我不需要支持任何较小的版本,但我也想与 v14 兼容。

更新:给定上述依赖项,npm list "@atlaskit/icon"将发出

my-atlaskit-editor@0.0.1 /local/path/to/my/editor
├─┬ @atlaskit/editor-core@120.1.2
│ ├─┬ @atlaskit/calendar@9.2.10
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/checkbox@10.1.14
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/datetime-picker@9.4.7
│ │ ├─┬ @atlaskit/field-base@14.0.5
│ │ │ └── @atlaskit/icon@20.1.2  deduped
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/droplist@10.0.8
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/editor-common@44.1.0
│ │ ├── @atlaskit/icon@20.1.2  deduped
│ │ ├─┬ @atlaskit/media-picker@54.2.3
│ │ │ ├─┬ @atlaskit/flag@12.4.5
│ │ │ │ └── @atlaskit/icon@20.1.2  deduped
│ │ │ ├── @atlaskit/icon@20.1.2  deduped
│ │ │ └─┬ @atlaskit/media-card@68.0.2
│ │ │   └── @atlaskit/icon@20.1.2  deduped
│ │ └─┬ @atlaskit/profilecard@12.4.4
│ │   ├─┬ @atlaskit/avatar@18.0.2
│ │   │ └── @atlaskit/icon@20.1.2  deduped
│ │   └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/editor-markdown-transformer@3.1.25
│ │ └─┬ @atlaskit/editor-common@46.1.1
│ │   ├── @atlaskit/icon@20.1.2  deduped
│ │   ├─┬ @atlaskit/media-card@68.0.2
│ │   │ └── @atlaskit/icon@20.1.2  deduped
│ │   └─┬ @atlaskit/media-picker@54.2.3
│ │     ├─┬ @atlaskit/flag@12.4.5
│ │     │ └── @atlaskit/icon@20.1.2  deduped
│ │     └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/emoji@62.8.4
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/form@7.4.1
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├── @atlaskit/icon@20.1.2 
│ ├─┬ @atlaskit/media-card@67.2.3
│ │ ├── @atlaskit/icon@20.1.2  deduped
│ │ └─┬ @atlaskit/media-viewer@44.4.4
│ │   └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/media-editor@37.0.12
│ │ ├── @atlaskit/icon@20.1.2  deduped
│ │ └─┬ @atlaskit/media-card@68.0.2
│ │   └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/media-filmstrip@38.0.4
│ │ ├── @atlaskit/icon@20.1.2  deduped
│ │ └─┬ @atlaskit/media-card@68.0.2
│ │   └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/media-picker@54.2.3
│ │ ├─┬ @atlaskit/flag@12.4.5
│ │ │ └── @atlaskit/icon@20.1.2  deduped
│ │ ├── @atlaskit/icon@20.1.2  deduped
│ │ └─┬ @atlaskit/media-card@68.0.2
│ │   └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/mention@18.18.3
│ │ ├─┬ @atlaskit/avatar@18.0.2
│ │ │ └── @atlaskit/icon@20.1.2  deduped
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/modal-dialog@10.6.4
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/radio@3.2.3
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/select@11.0.14
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/status@0.9.25
│ │ └── @atlaskit/icon@20.1.2  deduped
│ └─┬ @atlaskit/task-decision@16.1.2
│   └── @atlaskit/icon@20.1.2  deduped
├─┬ @atlaskit/media-picker@54.2.3
│ ├─┬ @atlaskit/dropdown-menu@9.0.6
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/flag@12.4.5
│ │ └── @atlaskit/icon@20.1.2  deduped
│ ├── @atlaskit/icon@20.1.2  deduped
│ ├─┬ @atlaskit/media-card@68.0.2
│ │ └── @atlaskit/icon@20.1.2  deduped
│ └─┬ @atlaskit/media-ui@12.5.1
│   ├─┬ @atlaskit/avatar@18.0.2
│   │ └── @atlaskit/icon@20.1.2  deduped
│   └── @atlaskit/icon@20.1.2  deduped
└─┬ @atlaskit/smart-card@13.5.1
  └── @atlaskit/icon@20.1.2  deduped

是否可以只替换包@atlaskit/icon而不替换和之间树中的所有包。在此示例中,它将是以下列表:my-atlaskit-editor@atlaskit/icon

@atlaskit/avatar
@atlaskit/calendar
@atlaskit/checkbox
@atlaskit/datetime-picker
@atlaskit/dropdown-menu
@atlaskit/droplist
@atlaskit/editor-common
@atlaskit/editor-core
@atlaskit/editor-markdown-transformer
@atlaskit/emoji
@atlaskit/field-base
@atlaskit/flag
@atlaskit/form
@atlaskit/media-card
@atlaskit/media-editor
@atlaskit/media-filmstrip
@atlaskit/media-picker
@atlaskit/media-ui
@atlaskit/media-viewer
@atlaskit/mention
@atlaskit/modal-dialog
@atlaskit/profilecard
@atlaskit/radio
@atlaskit/select
@atlaskit/smart-card
@atlaskit/status
@atlaskit/task-decision

为了更改dependencies嵌套包中的内容,需要覆盖很多包。在实践中,我需要分叉所有这些包并更改dependencies每个嵌套包以引用我的分叉版本,该版本再次仅修改dependencies指向我分叉的另一个包。在这整个被替换树的叶子上将是 a package.json,它指向 和 的自由变@atlaskit/icon体。@atlaskit/icon-file-type@atlaskit/icon-object

如果不分叉和修改整个树中的依赖关系,真的没有办法解决这个问题吗?

4

2 回答 2

3

NPM从 6.9.0 版本开始原生支持包别名

因此,在您的情况下,您可以采取以下方法:

  "dependencies": {
    "@atlaskit/editor-core": "npm:another-editor-core@^1.0",
    "@atlaskit/media-core": "npm:another-media-core@^1.0",
    "@atlaskit/smart-card": "npm:another-smart-card@^1.0"
  }

这将具有安装another-editor-core@^1.0而不是@atlaskit/editor-core. 然后,当您的代码尝试 require 时@atlaskit/editor-coreanother-editor-core将改为:

const editor = require("@atlaskit/editor-core") // this is actually another-editor-core

一种简单的管理方法是在 npm 中创建一个组织,这样您就可以拥有像@my-org-name/editor-core

编辑:

正如评论中所指出的,上面的解决方案不支持传递依赖,而只支持直接依赖。

即使使用npm-force-resolutions. 经过一番研究,我找不到任何其他可以与 npm 一起使用的工具。

然而,纱线使用选择性依赖解决方案支持这一点:

  "resolutions": {
    "@atlaskit/editor-core": "npm:another-editor-core@^1.0",
    "@atlaskit/media-core": "npm:another-media-core@^1.0",
    "@atlaskit/smart-card": "npm:another-smart-card@^1.0"
  }

所以我看到了 3 个选项供您前进:

  1. 迁移到纱线(如果您的项目允许这样做)
  2. 编写一个解析 package-lock.json 的脚本来覆盖解析的包。这实际上不应该那么难。该脚本可以作为预安装步骤运行,就像npm-force-resolutions
  3. npm-force-resolutions在repo上请求此功能,如果熟悉 clojure 和时间允许,可能会自己为 repo 做出贡献。

祝你好运!

于 2020-10-06T12:22:56.737 回答
0

另一种方法是使用 @atlaskit 包作为基础创建一个私有 NPM 包,然后用您自己的包替换依赖项。有关创建包描述的详细信息,请参阅https://docs.npmjs.com/files/package.json和发布私有包的https://docs.npmjs.com/creating-and-publishing-private-packages 。您可能需要考虑使用一种工具来自动化更新过程,以提取最新的 @atlaskit 包并创建和发布您的替代方案。

于 2020-10-08T21:15:36.013 回答