Pharo - 如何在版本控制中共享静态资源?

Pharo - How do I share static resources in version control?

假设我有一个图像被 Pharo Smalltalk 中的某些对象使用,我如何在 VCS 存储库中对它进行版本控制? Pharo 如何处理这些静态资源?

我知道我可以从操作系统层次结构树加载一个图像并放入一个 class 实例变量,例如,图像持久性将保存它,但我试图对这个包进行版本控制class 通过 Monticello,删除并加载它,图像位图丢失。

我找到了这个页面 http://smallthoughts.tonyfleig.com/Blog/article/id/1144940,但是由于我没有在当前的 Pharo 5 发行版和目录中找到 class,所以我不确定这是否合适方法。

Pharo(称为 Monticello)当前使用的版本控制系统无法处理这些类型的工件。 Monticello 知道 classes、方法、特征和其他一些东西,但它既不存储变量数据(例如 class 变量中的位图)也不存储其他资源。

话虽如此,您可以使用 Git 存储库作为后端(请参阅 FileTree 了解 Monticello 存储库,并且您可以自由地将资源添加到 Git 存储库想要(只要你不修改 FileTree 结构)。然后你可以在需要时简单地加载它们。

您有三个主要选择

将方法中的资产存储为代码

这是最常见的方法,Pharo 5 和之前的版本也使用它来存储图标(并且仍然被系统的某些部分使用)。

该方法是以某种编码格式(通常是 base64 或字节数组)将数据存储为字符串,然后在第二种方法中您可以对其进行解码。使用这种方法,资产只是一个常规代码,因此您将对其进行版本控制。例如:

MyIcons>>icons
    ^ icons ifNil: [ icons := Dictionary new ]

MyIcons>>myIconContents
    ^ 'BASE64STRING'

MyIcons>>myIcon
    ^ icons
            at: #myIcon
            ifAbsentPut: [ Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes: self myIconContents readStream) ].

理想情况下,您还可以将 MyIcons class 设置为单例,以便它可以正确缓存它。

手动完成这可能有点乏味,所以我前段时间为此编写了一个工具https://github.com/peteruhnak/IconFactory(它仍然非常基础,但它主要完成了它的工作)。

在 CI 中添加资产/根据需要从网络加载它

如果您使用 CI(Jenkins、Travis)为最终用户生成预构建图像,您可以将资产作为构建脚本的一部分加载到那里。我相信,这就是 Pharo 6 当前用于图标的内容。然而,缺点是用户必须始终使用构建的图像,否则它会自动(从 class' 初始化)从网络某处下载资产(如果您没有互联网访问,这可能是个问题,或者网站已关闭)。

使用Git

最后,如果您使用 git 来存储代码(GitFileTree 或 IceBerg),那么安装项目也需要存储库的副本(因此它会自动下载一个,或者您将其指向您的本地克隆)。然后您可以引用克隆的存储库来检索数据。这很可能有点挑剔,但原则上应该是可行的。


另请注意,有一些计划使用 Pharo 6(当前开发版本)正确管理资产,但我不确定它的状态,或者它是否在这个版本中被删除(这将推动开发最有可能用于 Pharo 7)。