Mike Hearn 最初使用 Pascal 为 MS-DOS 编写 GUI,现在领导着 Hydraulic 公司,该公司致力于简化在浏览器外部发布应用程序的过程。在 2006 年至 2014 年期间,他参与了 Gmail 和 Google 地图的开发,并开发了 Google 的主要反机器人系统;他是最早的比特币开发者之一,他通过参与 Wine 项目帮助 Internet Explorer 和游戏在 Linux 上运行,并开发了多个开源库。他居住在瑞士苏黎世。
<raw_text>0 嗨,感谢收听。这是 It's So Widget's Flutter播客。我的名字是 Hela Korn。每一期节目,你都有机会与 Flutter 社区的另一位优秀成员交谈。在本期节目中,我们非常幸运地能够与 Mike 交流。欢迎。嗨。
感谢你的参与。那么首先,你想分享一下你的背景吗?是的,当然。我的背景可能有点不寻常,因为我传统上更像是一个后端开发者而不是 UI 开发者,但我已经编程很长时间了,而且我一直都在不同时期做 GUI。我的第一个,我想,是在 90 年代初的 MS-DOS 上的 Borland Turbo Vision,然后升级到 Windows 3.1,从那以后就一直在断断续续地做 GUI 和其他事情。
我在 Google 工作了几年,从 2006 年到 2014 年,离开后我还做过其他项目。现在我经营着 Hydraulic,这是一家位于瑞士的公司。我们制作 Conveyor,这是一个面向桌面应用程序开发人员的工具,可以非常非常轻松地将您的应用程序发布到桌面上。太棒了。你是怎么第一次听说 Flutter 的?
我想我几年前就听说过 Flutter 了,我记得当时看过它,当然,它当时主要还是一个移动工具包。我去年年底又开始关注它,因为我和一位告诉我应该看看 Flutter 的人谈过话,他说:“哦,你们真的应该看看 Flutter,它周围有很多兴奋点。它发展得非常快。它有一个非常好的社区。”这个人实际上是一位风险投资家,但他有开发背景。
嗯,
他只是在极力赞扬它,不仅是技术本身,还有他遇到的使用它的那些人。他说:“你们应该做一些与之相关的事情。这是最佳选择。”所以我们看了一下,我很高兴看到它已经不仅仅是移动端了。我主要玩的是桌面版本,因为这正是我现在最感兴趣的。它只是
它很棒。你知道,它启动速度非常快,而且很容易上手,代码也很简洁,它对我这种长期使用 GUI 工具包的人来说很有吸引力。嗯,我用过很多不同的工具包,嗯,
Flutter 看起来真的很好。所以我说,好吧,我们应该支持它,尤其因为我们部分感兴趣的是,当人们构建了服务的移动版本后,如何才能将他们的应用程序带到桌面或大屏幕上,我们有时也这么称呼它。人们如何快速、轻松、廉价且愉快地将他们的应用程序带到大屏幕上?
而今天这样做的标准方法是将所有内容重写为 Web 应用程序。
这也能行。但从开发者的角度来看,这并不是理想的,从最终用户的角度来看也不是理想的。如果你是一个非常休闲的用户,这很方便。例如,如果你每周或每月只使用这个应用程序五分钟,或者你可能只使用一次就再也不用了,那么当然很方便。但如果这是一个更严肃的应用程序,而且你经常使用它,那么拥有一个更高效、启动速度快且能很好地与你的操作系统集成的桌面版本会更好。
所以我认为,当人们将他们的移动应用程序带到大屏幕上时,这将是一个很好的方法。但是,正如桌面工具包经常出现的情况一样,部署工具在我看来并不是很好。实际上,Flutter 并没有真正的部署工具包,对吧?文档只是将你指向 Microsoft、Apple 和 Linux 社区提供的原生工具。
所以我们继续添加了对 Flutter Desktop 的支持,这实际上非常简单。我们在 2 月份推出了它。是的,现在我们正试图让 Flutter 社区知道它在那里,并且这肯定比以前更可行、更容易的选择。
非常酷。这很有道理。我认为我看到的关键价值在于,它使你能够在商店之外发布 Flutter 应用程序。这是我与 Invoice Ninja 合作时遇到的一个问题。我们实际上目前没有。目前,应用程序只能通过 Conveyor 在商店本身中获得。这使得它成为可能。对吗?
是的,绝对的。我的意思是,我们将来可能会添加对商店的支持。我们从外部开始,因为在桌面上,人们经常想要在商店之外发布。因为,你知道,这样你就不用处理规则、收入分成等等。
因此,如果您在商店之外,Conveyor 会处理您需要的一切。它为您集成在线更新,它构建所有包,并且它可以在您的桌面上执行此操作。在某些情况下,您不需要,我的意思是,对于目前的 Flutter 桌面,您需要在每个平台上进行编译,但是实际的打包过程本身只需要在一台机器上运行,这非常方便。
它会进行图标转换。它甚至会为您生成一个检测用户 CPU 和操作系统的下载页面。它会进行签名和公证。它基本上会做所有事情。因此,它使发布变得非常容易。因为它支持在商店之外发布,所以也没有审批流程或类似的东西。你只需要一个 Web 服务器。
也就是说,你知道,有些人出于其他原因想要进入商店,例如分销,因为商店会为您处理账单和税务等事宜。所以我认为我们将来可能会添加对上传到商店的支持。太好了。是的。我的意思是,我们想进入商店。这只会让事情变得更简单。我们还希望理想情况下使用它来为应用程序留下评论。我认为这有助于提高知名度。但是现在,
根据我们的经验,我发现,在 Mac 上,人们非常乐意从商店安装。在 Windows 上,我们会收到定期的请求。人们只是不想使用 Microsoft Store,他们想要一个在商店之外的选择。在 Android 上,人们需要在商店之外。人们喜欢使用 FDroid,这是一个替代性的场所。在 Linux 上,我们使用 Snap,Flutter 使其非常简单。但最近,我们收到了很多关于支持 Flatpak 的请求。是的。是的,桌面空间非常分散。
你知道,我们正在考虑添加对 Flatpak 的支持。一个问题是,是的,还有,你知道,Linux 空间一直以来的碎片化问题,对吧?Ubuntu 不想支持 Flatpak。他们希望每个人都使用他们的 Snap 商店。所以 Conveyor 生成……
例如 tarballs 和 Debian 存储库,因此您不必处理这些问题,您只需发布文件,然后您就知道许多用户可以获得自更新的包,而不会受到 Snap 的限制。Snap 或 Flatpak 的问题之一是强制性的沙盒,并非每个应用程序都与之兼容,嗯
然后,是的,在 macOS 上,我倾向于发现我正在使用的应用程序大多不在 Mac App Store 中。我不知道是不是只有我这样,但人们经常发现……
你知道,Apple 可能会由于某种原因拒绝更新或其他什么原因。他们不想承担这种商业风险。但我们的目标,我们的愿景实际上是让以任何你想要的方式发布桌面应用程序变得超级超级容易。所以我认为我们接下来要考虑的是,你知道,Mac 商店。实际上,Microsoft Store 可能更容易添加支持,但我们最终也会支持 Mac Store。
这可以与 GitHub Actions 一起使用吗?是的,绝对可以。实际上,这是我们最近关注的事情之一,特别是对于开源应用程序,我们对此有非常好的支持。对于开源应用程序,它是免费使用的。您可以将 GitHub Releases、Actions 和 Pages 组合在一起,为桌面应用程序获得持续部署。您可以非常轻松快速地设置它。我们有一个
教程说明如何操作,以及一个使用 Flutter 执行此操作的示例存储库,因此您可以……您知道,您可以进行推送,GitHub Actions 将在每个平台上编译您的应用程序,然后它运行 Conveyor,Conveyor 构建所有文件、更新元数据等等,将其推送到新的版本,并且……您的客户端会立即开始更新到最新的 GitHub 版本……并且……
下载页面也将刷新,这将自动签入并推送到您的 GitHub Pages。因此,从那时起,它实际上就是一个命令,一切都在轨道上。或者,是的,您在某个地方运行它,一个推送钩子,您只需推送,一切都会更新。因此,如果您构建在 GitHub 堆栈上,那么这将非常方便。
太棒了。我的意思是,如果我可以进行手动 Windows 构建,这将是我们面临的一大挑战。我们可以通过命令行通过 Flutter 轻松构建,但是用户会坚持我们发布的版本。
这会强制更新。对吗?当他们重新启动时,这是如何工作的?实际上,您可以通过两种方式进行操作。Conveyor 支持至少两种模式。三种,您也可以关闭更新或使其完全手动。但是,如果您使用自动更新,默认情况下是一种后台更新模式,有点像,好吧,在 Windows 上,它是一个后台更新,所以它就像 Chrome。因此,Windows 本身会保持您的应用程序,如果
应用程序是最新的。然后它大约每八小时轮询一次。它执行增量更新。它甚至可以在应用程序运行时更新应用程序,即使它没有运行。
所以它是一种非常类似 Chrome 的体验。在 macOS 上,我们使用 Sparkle,因为这样它就是一个广泛使用的工具包,这样你就不会被锁定。Sparkle 也可以在后台更新,或者它可以询问用户,您是否每次都想要确认,或者您是否想要更新?然后我们还支持一些名字不太好的东西,但我们不太确定该怎么称呼它。所以我们称之为积极更新,这几乎是类似 Web 的更新模式,每次应用程序启动时,它
它会检查您的存储库,这只是某个地方 Web 服务器上的静态文件。它会检查是否有新版本。如果有,它会立即下载并应用它,然后启动应用程序。因此,通过这种方式,只要您不时重新启动应用程序,您就可以确保用户始终是最新的,而且速度也很快。所以这给了你这种……
保证,如果您发布新版本,那么您的用户将非常快速地获得更新。
太好了。UI 是如何处理的?它是否需要自定义 Flutter 代码,或者包是否会处理向用户显示下载正在进行?是的,所有这些都会自动为您处理。这取决于操作系统。在 Windows 上,我们有一些自定义 UI 会在应用程序安装或更新时显示进度条和您的应用程序徽标。
在 Windows 上,实际上发生的情况是,我们生成一个小的,大约 500 千字节,非常小的,小的安装程序应用程序,然后它实际上会驱动下载。我们这样做的原因是因为我们实际上正在将下载和安装过程委托给 Windows,而最新版本的 Windows,我说的是最新版本,Windows 10 及更高版本,所以现在基本上每个人都有它,实际上只会下载您需要的文件部分。因此,如果您已经安装了 Flutter 应用程序,那么……
然后下载,您安装的第二个应用程序实际上不会再次下载 Flutter 运行时等等。它实际上会重用您磁盘上已经拥有的数据。它只是将其复制到新的安装目录中。因此,这可以使应用程序的安装速度非常快,即使它们具有大型运行时,也可以使安装速度非常快,因为您只下载对您的程序唯一的代码。这是一个非常棒的功能。
在 Mac OS 上,我们使用 Sparkle。因此,它是本机 Mac UI 来呈现进度条,并且,你知道,只是一些按钮和东西。因此,它在每个平台上都是本机 UI。这意味着您实际上不必调整您的应用程序。无需更改您的代码或任何类似的东西。所有这些都是为您完成的。太棒了。非常酷。你能详细介绍一下证书是如何处理的吗?
是的,对。是的,好问题。因为代码签名在分发到桌面时总是很痛苦,这已经……好吧,实际上,不仅仅是桌面,对吧?您也必须为移动设备签名。所以这是许多开发人员非常熟悉的。因此,实际上,Conveyor 本身会执行所有签名和公证工作,这就是为什么它能够从任何操作系统为每个操作系统构建和分配所有包的原因。因此,您实际上可以在 Linux CI 机器或您的笔记本电脑上执行所有打包等等并进行发布。
对于不需要任何原生编译的框架,嗯,这意味着您可以做任何事情。您可以从您的笔记本电脑向所有人发布一个完整的桌面应用程序。现在,Flutter 目前确实需要一些原生编译。这并不是根本性的,对吧?因为……Dart VM 是一个跨平台的 VM。所以也许在未来的版本中,这将不再是必要的,但是……能够做到这一点非常好。它可以做到这一点,因为它本身实现了所有登录代码。嗯,您只需提供……您的……
您从 Apple 或 Windows CA 获取的证书。或者,如果您没有它们,也没关系,它实际上会生成并进行自签名。它会为您生成证书并进行自签名。因此,您会收到安全警告,但应用程序仍然能够自动更新,并且它仍然被正确签名,这在许多情况下是操作系统想要的。但除此之外,是的,您向它提供您的证书,它甚至会为您生成 CSR。因此,如果您没有证书,它会引导您完成获取它们的流程。
所有这些都源于您可以用笔和纸写下的单个根密钥。然后您按下 Go,它将继续对所有内容进行签名并上传到 Apple 进行公证,从那时起,一切都在轨道上。只需按 Enter 键,一切就都完成了。太好了。听起来很棒。花了大量时间管理证书和备份它们。是的,我们在代码签名的可用性方面做了很多工作,我们还可以做更多的事情。你知道,总有……
改进其可用性的方法。但是,例如,我们进行许多可用性健全性检查,因为基本上每次有人卡住或遇到问题或提交支持工单时,我们都会深入研究并更新产品以确保不会再次发生这种情况。所以现在有很多小的代码路径检查。您是否使用了错误类型的证书?您是否使用了错误类型的 Web 服务器,这在某些情况下可能很重要?处理 Apple 公证服务的所有时间故障等等。所以是的,我们在这方面投入了大量工作。
你能谈谈商业模式、定价吗?是的。正如我已经提到的那样,对于开源应用程序,它是免费的。它本身不是开源的。它是一个产品。它不是服务。它不是 SaaS 平台。如果人们想要,我们可以做其中之一。但它是一个开发工具。因此,我们将其作为您在本地运行的命令行应用程序来发布。这使您可以非常快速地进行迭代。
您只需使用本地配置文件对其进行配置,进行调整,它实际上是一个增量并行构建系统。因此,您可以进行调整并非常非常快速地查看对打包的影响。
然后对于商业应用程序,您需要付费,它是订阅定价,并且您会获得支持,我们的客户往往非常喜欢这一点,每月 45 美元。为此,您可以获得三个应用程序。我们将应用程序定义为更新 URL,基本上。因此,不同的平台都被认为是一个应用程序。如果您有 Mac、Windows、Linux 等,则为一个应用程序。但是,如果您想要
应用程序的不同版本或不同版本或任何单独更新的内容,那么我们将这些视为不同的应用程序,这就是为什么我们以该订阅的价格包含三个应用程序的原因,因为这样您就可以例如拥有一个测试版渠道,并且所有这些都包含在价格中。明白了,听起来很棒,对于未来,您计划添加其他功能吗?好吧,你知道,我们是由用户的需求驱动的,目前,在过去六个月左右的时间里,我们花了很多时间……只是……随着客户的到来和……
需要功能或遇到问题或其他什么问题。我们一直在解决这些问题。我认为我们接下来要关注的是,首先,我们正在开发一个 IntelliJ 插件。因此,设置起来更容易,因为 Conveyor 完全是关于可用性的。这就像主要的宣传。它就像消除在浏览器外部发布的痛苦。
然而,关注商店之类的东西,也许像 Flatpak 之类的东西,我们会看看。我们倾向于看到对此有很多兴趣,因为人们将其视为新事物。但是开发人员通常的主要关注点是他们只想让 Linux 工作。他们不想投入大量时间。因此,我们将研究支持沙盒和那里特定事物的努力程度。而且,从长远来看,
我想说的是,我们正在努力实现的愿景是,我们希望使在浏览器外部分发软件与通过浏览器分发软件具有竞争力。因此,我们一直在探索一些想法,例如,如果您几个月不使用应用程序,它会自动卸载自身,例如。因此,人们喜欢 Web 应用程序或发现它们方便的原因之一是它们是“自清洁”的。
您实际上不必以任何方式管理它们。它们进入缓存,一段时间后会被浏览器自动删除。
没有理由您不能在桌面上也这样做。您可以拥有自清洁应用程序。我们还考虑过的一件事是代表其他人进行签名。对于那些……如果您今天没有证书,但我们可以快速验证您没有分发恶意软件,我们会为您签名。我们能够验证这一点的一种方法是,如果您愿意在沙盒中运行。如果……你知道,如果你愿意走这条路等等,那么我们可能会……因为我们可以……
在这种情况下,您会将您的文件上传给我们,我们会为您构建包,然后因为我们控制着打包,所以我们控制着入口点。因此,此时可以更改应用程序,以便在运行您的代码之前强制执行沙盒。通过这种方式,我们非常有兴趣不断降低复杂性,不断提高可用性,直到……
对于开发人员和最终用户来说,这与实际构建 Web 应用程序一样容易,甚至更容易。太棒了。作为开发人员,我们欣赏简洁性,对吧?保持简单。是的,这就是……我认为作为开发人员,我们经常发现很容易花费过多的时间来设置东西、配置东西等等,并在过程中遇到一些小问题,但是
我们发现我们的客户经常出现,他们往往会因为手动操作的难度和复杂性而感到有点震惊。他们只是说,好吧,我以为这很容易。我以为我可以自己做。现在我只想让某人消除复杂性,消除这种痛苦。你还想补充或推广什么吗?好吧,让我考虑一下。
我想说的一件事是,这实际上在您在组织内部分发应用程序的地方非常有意义。我们现在往往不再考虑这种情况下桌面应用程序。但是,例如,如果您想为某些内部数据库或仪表板制作 UI,那么同样,从历史上看,将其作为桌面应用程序将需要付出太多努力。但是现在分发方面变得如此容易。
特别是对于在公司内部分发,您甚至不需要对其进行签名,因为自签名就足够了。在这种情况下,即使您想这样做,也可以让员工安装他们自己的根证书机构。
您可以开始制作在启动时立即更新的应用程序,并且您甚至可以利用出色的 Flutter 开发体验,包括不错的语言、热重载和不错的工具包等等,即使是在您以前只使用 HTML 制作了一些东西的情况下。