为啥我不应该发布用 Ivy 编译的库?

Posted

技术标签:

【中文标题】为啥我不应该发布用 Ivy 编译的库?【英文标题】:Why shouldn't I publish libraries compiled with Ivy?为什么我不应该发布用 Ivy 编译的库? 【发布时间】:2021-05-02 10:17:05 【问题描述】:

我有一个我们公司使用的工具包库。目前,我们正在将所有项目迁移到angular 11。所以很自然,我们也将我们的工具包库更新到了 Angular 11。

从 ng11 开始,Ivy 是默认引擎,我认为打开它是个好主意,所以我们的应用程序不需要使用 ngcc 编译它。所以我在我们的package.json中设置了这个:

  "angularCompilerOptions":  "enableIvy": true ,

但是当我尝试推送它时,我看到了错误:

npm 错误! my-lib@0.0.1 prepublishOnly: 节点 --eval "console.error('错误:试图发布一个已经被 常春藤编译。这是不允许的。\n请删除并重建 包,无需使用 Ivy 编译,然后尝试 发布。\n')" && 退出 1

似乎这个错误生成到 dist 编译代码中,如果我使用 Ivy 编译,它会阻止我推送到我们的关系。

在此处找到此报告并提供官方答案:

https://github.com/angular/angular/issues/37973

我的问题是:为什么会这样?为什么不建议用 Ivy 发布呢?这样,lib 使用 ViewEngine 编译,然后作为依赖项安装(在我们的 angular 11 项目中),仅使用 ngcc 预编译以与 Ivy 兼容,这对我来说似乎是一个不好的做法。

我觉得我在这里误解了一些东西,有人可以向我解释一下吗?

【问题讨论】:

What's wrong with this answer? 老实说,我只是在他们关闭问题之前阅读,并且看到了关于 workaroudns 的最后几个 cmets,并没有阅读所有这些,因此这避免了我的注意力。谢谢您 - 如果您将其提取为答案,我会很乐意接受。 【参考方案1】:

如 this answer on that github link 中所述

原因实际上是前向兼容性。如果我们允许 ivy 编译 图书馆要立即发布,然后我们将自己锁定在一个 ivy指令集和数据结构的非常具体的使用。这 会影响我们进行实施更改 将修复错误、提高性能、减少代码大小等。通过 保持常春藤内部的私密性,我们可以更加敏捷。

目前实现这一点的方法是要求编译 ViewEngine 代码(因为这会保留装饰器信息),它 ngcc 能够在库安装时转换为常春藤代码/ 应用程序构建时间。展望未来,我们正在研究部分 两全其美的编译库格式:不是 需要一个冗长的 ngcc 构建步骤,但也不暴露 ivy 运行时的内部结构。

【讨论】:

以上是关于为啥我不应该发布用 Ivy 编译的库?的主要内容,如果未能解决你的问题,请参考以下文章

在 netbeans 中使用 ant ivy

我不知道如何使用 Apache Ivy

如何附加使用 ivy 下载的库的源代码

使用 ivy 兼容库时是不是仍需要运行 ngcc

我不明白为啥会这样编译

为啥 Ivy 无法解析我的配置