假设我有Pharo Smalltalk中某些对象使用的图像,我该如何在VCS存储库中对其进行版本控制? Pharo如何处理这些静态资源?
我知道我可以从操作系统层次结构树加载一个图像并放入一个类实例变量,例如,图像持久性将保留它,但我试图通过Monticello对这个类的包进行版本化,删除和将其加载回来,图像位图丢失了。
我找到了这个页面http://smallthoughts.tonyfleig.com/Blog/article/id/1144940,但由于我没有找到当前Pharo 5发行版和目录中描述的类,我不确定这是否是一个好方法。
答案 0 :(得分:2)
您有三个主要选项
这是最常用的方法,并且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
类成为单例,因此可以正确缓存它。
手动操作可能有点单调乏味,所以我前段时间已为此编写了一个工具https://github.com/peteruhnak/IconFactory(它仍然非常基础,但它主要完成它的工作)。
如果您为使用CI(Jenkins,Travis)的最终用户生成预构建的图像,则可以将资源作为构建脚本的一部分加载到那里。我相信,这是Pharo 6目前用于图标的内容。然而,缺点是用户必须始终使用构建的图像,或者它会自动(从类初始化)从网上某处下载资产(如果您不能访问互联网,这可能会有问题) ,或网站已关闭。)
最后,如果您使用git来存储代码(GitFileTree或IceBerg),那么安装项目还需要一个存储库的副本(因此要么自动下载一个,要么将其指向您的本地克隆)。然后,您可以引用克隆的repo来检索数据。这很可能有点挑剔,但原则上应该是可能的。
另请注意,有一些计划正在使用Pharo 6(当前开发版本)正确管理资产,但我不确定它的状态,或者是否因此版本而被删除(这将推动Pharo的开发7最有可能)。
答案 1 :(得分:0)
Pharo目前使用的版本控制系统(称为Monticello)无法处理这些类型的文物。蒙蒂塞洛了解类,方法,特征和其他一些东西,但它既不存储可变数据(例如,您在类变量中的位图),也不存储其他资源。
话虽如此,您可以使用Git存储库作为后端(请参阅FileTree以获取Monticello存储库,您可以根据需要随意添加资源到Git存储库(只要您不要这样做)。修改FileTree结构。然后你可以在必要时加载它们。