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)。
假设我有一个图像被 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)。