Pharo依赖地狱

时间:2014-09-05 10:10:23

标签: dependency-management smalltalk pharo

我正在尝试在Pharo中开发一个简单的项目,我想在Metacello中添加它的依赖项。我的项目取决于Glamour,Roassal和XMLSupport。

干净地安装我的项目的方法是先手动安装依赖项。在书Deep into Pharo之后,可以做

Gofer new
  smalltalkhubUser: 'Moose' project: 'Glamour';
  package: 'ConfigurationOfGlamour';
  load.
(Smalltalk at: #ConfigurationOfGlamour) perform: #loadDefault.

Gofer new smalltalkhubUser: 'ObjectProfile'
  project: 'Roassal';
  package: 'ConfigurationOfRoassal';
  load.
(Smalltalk at: #ConfigurationOfRoassal) load.

Gofer new
  squeaksource: 'XMLSupport'; 
  package: 'ConfigurationOfXMLSupport';
  load.
(Smalltalk at: #ConfigurationOfXMLSupport) perform: #loadDefault.

然后我的项目就可以了。

我尝试使用Versionner创建ConfigurationOfMyProject,并使用当前安装在我的映像中的版本添加了Glamour,Roassal和XMLSupport作为依赖项(2.6-snapshot,1.430和1.2.1分别地)。

问题是我无法在新图像中使用Metacello加载我的项目。该项目加载正常,但每当我尝试加载我的类时,我得到方法缺少Glamour中的错误。而且,很明显有些东西是不同的,因为即使世界菜单也有不同的条目。

我尝试了其他版本的组合,包括使用稳定的Glamour(2.1),但我已经获得了更多错误,包括甚至无法在Versioner中打开项目(它抱怨缺少Roassal名称)。

干净地添加这些依赖项的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

首先,我想强调一下,如果配置在类 ConfigurationOf< proj-name> 中,您可以使用#configuration消息加载它:

Gofer new
  smalltalkhubUser: 'Moose' project: 'Glamour';
  configuration;
  load.
(Smalltalk at: #ConfigurationOfGlamour) perform: #loadDefault.

我没看到你的项目,我可以建议你手工编写配置。有一个名为Dead simple intro to Metacello的简单教程。

根据你的描述,它应该是这样的:

baseline01: spec 
  <version: '0.1'>

  spec for: #common do: [  
    spec blessing: #release.
    spec repository: 'your repo url'.

    spec 
      package: 'YourPackage' with: [
        spec requires: #('Glamour' 'Roassal' 'XMLSupport') ].
    "also maybe you have a couple of packages that depend on different projects"

    spec project: 'Glamour' with: [
      spec 
        className: 'ConfigurationOf Glamour';
        repository: 'http://smalltalkhub.com/mc/Moose/Glamour/main';
        version: #'2.6-snapshot' ].

    spec project: 'Roassal' with: [
      spec 
        className: 'ConfigurationOfRoassal';
        repository: 'http://smalltalkhub.com/mc/ObjectProfile/Roassal/main';
        version: #'1.430' ].

    "and same for XMLSupport" ].

此外,您可以尝试加载#development版本,因为我的印象是像Roassal和Glamour这样的项目已经过时了稳定的版本。另请注意,Roassal2正在积极开发中,将取代Moose平台中的原始Roassal,也许您想考虑使用它。

答案 1 :(得分:1)

我会非常不鼓励手写编写配置 - 这是Metacello的汇编代码;)除非您正在使用特定于平台的代码(例如Pharo 1.4与Squeak 4.5的代码)进行跨Smalltalk平台项目 - 一个区域还没有探索过,Versionner是你的工具。我已经用它写了几十个配置文件,还没有遇到障碍。

当您说将它们添加为依赖项时,您是否只是将它们作为项目添加到“从属项目”窗格中?

enter image description here

如果是这样,您还必须指定项目的哪些包依赖于它们。为此,请在“包”窗格中选择项目的相关包。

enter image description here

现在,点击刚刚启用的铅笔图标的编辑按钮。在出现的对话框中,单击绿色的+按钮并添加感兴趣的外部项目。

enter image description here

答案 2 :(得分:1)

看起来你在旧版Pharo中尝试这个?

Roassal已被Roassal2取代,对XML的支持在smalltalkhub上,分为ConfigurationOfXMLWriter和ConfigurationOfXMLParser,两者都在PharoExtras中。

如果你从Glamour加载正确的组,你不需要描述对Roassal的依赖,因为Glamour已经依赖于Roassal(2)。这解释了你的循环依赖。

您还遇到了我们最近在pharo邮件列表上谈到的问题 #stable不是可用的符号版本名称。在Seaside / Magritte / Grease项目中,我们改为使用#'release3.1'样式的符号版本名称。这可确保稳定进展时产生较小的连锁反应。

快照版本永远不应该是依赖项,它们只描述当前加载的内容,并且基本上不可升级。

[编辑] 默认情况下,Metacello试图明智地表示不安装较新版本的旧版本。只要不将东西移动到不同的包中,这种方法就能很好地工作。所以在那里运气不好,你最终得到了一个非工作组合。

Metacello支持复杂的工作流程,以及不同的smalltalk项目(需要)使用不同的工作流程。通常需要一些时间就最佳做事方式达成共识。

Roassal不依赖于Glamour,但您可以在自己的配置中创建循环:)

软件包已从squeaksource移至ss3和smalltalkhub,因为服务器存在稳定性问题。最近,这些问题似乎已得到解决。 xml支持是分开的,因为注意到许多应用程序实际上不需要写入和读取xml。

一旦你有了工作配置,在pharo的持续集成服务器上构建和测试它可能是一个好主意:http://ci.inria.fr/pharo-contribution 如果不是您的实际应用程序,至少是您使用的开源部分。那样Pharo,Glamour&amp; Roassal团队可以知道他们做出的改变是否会破坏某些东西。