YaST 从 YCP 中独立
2007 年 8 月 29 日 | Andreas Jaeger | 无许可
openSUSE 10.3 Beta 2 的发布消除了 YaST 开发中的另一个重大障碍:著名的 YCP 语言不再严格需要用于 YaST 开发。开发者可以使用 Perl,以及在较小程度上,Python 或 Ruby。
历史
这经历了一个漫长的过程。YCP 要求已被认为是新 YaST 开发者面临的一个主要问题,已经有相当长一段时间了。不幸的是,摆脱它并不容易,正如人们从 YCP 的原始含义中可以推断的那样:YaST 通信协议。
第一步是在 SUSE Linux 9.1 中完成的,Klaus Kaempf 和 Stanislav Visnovsky 引入了一个新的 YCP 解释器。由于更改非常大,YaST 开发者也投入了时间来为引入其他脚本语言做准备。事实上,Perl 绑定也是由 Martin Vidner 在那时开发的。然而,Perl 绑定存在严重的限制,最重要的是缺少直接处理用户界面库的支持。为此,开发者需要使用 YCP 包装器。
在 SUSE Linux 10.0 中,Perl 绑定被用于使用 Thomas Fehr 新开发的存储库。此时,Perl 绑定的质量达到了一个状态,即使是像从/到 C++ 的回调这样非常高级的功能也能工作。但是,用户界面仍然仅支持 YCP。
现在
现在,终于在 openSUSE 10.3 中,最后一个主要的的技术障碍被消除了——由于 Martin Vidner 的努力,非 YCP 语言现在可以使用用户界面库函数。YaST 团队也完成了对 Ruby 和 Python 的初步支持(Duncan Mac-Vicar 和 Josef Uhliarik),尽管它们还需要更多的关注和测试。
它是如何运作的?
很简单 ;-) 。看看经典的“Hello, world”示例,如何显示 YaST 对话框 (//svn.opensuse.org/svn/yast/trunk/perl-bindings/doc/examples/helloui.pl)。
YCP
{ UI::OpenDialog( VBox( Label("现在我们可以从其他语言调用 YaST UI!"), PushButton(“&那又怎样?”) ) ); UI::UserInput(); UI::CloseDialog(); } `
Perl
`#! /usr/bin/perl -w use YaST::YCP qw(:DATA :UI); YaST::YCP::Import “UI”; YaST::YCP::init_ui ($ARGV[0] || “qt”);
my $c = VBox( Label(“现在我们可以从其他语言调用 YaST UI!”), PushButton(“&那又怎样?”) );
UI->OpenDialog($c); UI->UserInput(); UI->CloseDialog(); `
正如你所看到的,代码几乎相同。幕后有一些魔法,但这就是语言绑定的常见情况。
我该如何尝试?
获取 openSUSE 10.3 Beta2 并从 YaST SVN 下载一个示例 Perl 脚本,或者从 Factory 树中获取 yast2-perl-bindings-2.15.3 (//svn.opensuse.org/svn/yast/trunk/perl-bindings/doc/examples/helloui.pl)。
现在,你可以简单地执行
/usr/bin/perl ui.pl
如果你对其他 UI 感兴趣,请使用
/usr/bin/perl ui.pl ncurses /usr/bin/perl ui.pl gtk
你可以将其与
/sbin/yast2 /usr/share/doc/packages/yast2-core/libyui/examples/Label3.ycp
不幸的是,由于各种问题等待解决,Python 和 Ruby 此时无法使用。
未来
还有很多工作要做。最值得注意的是,关于这项技术几乎没有文档和示例,尽管 opensuse.org 上的 YaST Wiki 页面包含大量关于 YaST 开发的信息。YaST 团队也继续致力于 Python 和 Ruby 绑定。