文章
· 十一月 14, 2022 阅读大约需 7 分钟

ZPM介绍(1)

ZPM介绍

有Developer听闻了InterSystems的包管理器ZPM, 希望我能介绍一下。正好刚刚看到一个开发者论坛的新闻: Open Exchange ZPM is now InterSystems Package Manager , 觉得更有必要了。

zpm是什么

简单说:zpm, 全称InterSystems ObjectScript Package Manager, 是一个包管理器, 开发者是Nikolay Soloviev和Dmitry Maslennikov。它先是在开发者社区里得到认可,以至于InterSystems开发者社区最近的一些比赛,要求参赛作品用zpm打包。然后就有了上面的链接的内容:InterSystems决定把它做为自己官方的打包工具, 将它改名字叫IPM(InterSystems Package Manager),同时保持它的开源状况不变。

这里我还是用zpm称呼它。两个原因。1. 操作的命令还是zpm, 所谓ipm,只是官方给的名字。2. ipm新的注册中心还不太了解,而且到目前为止,IPM的注册中心还只对自己的雇员和付费用户开放。本文的读者应该都还没来得及付费,所以暂时先放放,还是叫它zpm。

考虑到没有程序员背景的读者而对包管理器不熟悉,啰嗦两句。

什么是包管理器

大多数开发工具都有自己的包管理器,Java开发使用MAVEN, Python用PIP, NodeJS使用npm, 它们细节有区别,功能大致是一致的,就是安装管理程序包,最基本的工作是:

  1. 找到自己要的程序包。 简单的命令能让你在网上找到它,用名字找,或者其他方法搜索。
  2. 安装包。
    • 这里面最重要的是发现包之间的依赖。比如你要装一个软件包叫“包饺子”,作者在开发的时候使用了另一个软件叫“和面”,这个“和面”可能是作者自己写的,或者是网上其他人写的,注册在包管理器的。这时候作者在”包饺子“里声明,我依赖”和面“。 那么,当您去下载安装"包饺子“的时候,包管理器会自动的把”和面“也给你下载并安装上。
  3. 管理包: 比如升级,删除等等。

ZPM的特点

没有zpm的时候,人们是怎么传递ObjectScript代码的? 大概是这样:发布者把代码从studio导出成一个XML;接受者拿到这个xml, 然后使用Studio或者iris管理门户把它导入到一个命名空间。

这里面有两个问题:1. 麻烦, 2. 没有打包各种类型文件的能力。通常一个项目,除非是只使用ObjectScript, 多数都用到各种文件:前端的css, html, javascript, 图片; 各种配置文件xml或者yaml, 其他语言的包 (iris支持嵌入式python,以及集成多种编程语言工作)等等。

ZPM是怎么工作的?

  1. 作者把自己的数据放在一个公网地址上,比如github; 使用zpm生成一个配置文件(module.xml); 把module.xml发布到zpm的registry, 让别人能找到你的软件包。
  2. 使用者在Registry搜寻并下载这个程序包,zpm命令自动把它导入到IRIS的一个命名空间。

为什么能自动导入到iris ? 这里有个ZPM和其他包管理器的很大的区别: ZPM命令是在IRIS的terminal里执行的, 而不是操作系统上。

还有一个特点:zpm的设计假设大家开发代码使用的IDE是VSCode而不是Studio,这非常关键。Studio上的开发是在服务端的开发,没有一个类应该存在哪个文件目录的概念。VSCode相反,你创建一个类:Demo.Web.Test, 那么默认的文件保存是在一个这样的目录下: ./src/Dome/Web/Test.cls

不遵循这样的目录结构,您要额外做很多手工的调整才能使用zpm保存加载程序包。

这里还有很多问题, 我们后面详细说。

ZPM的下载安装

您可以从github上的InterSystems-Community用户的zpm Repo下载zpm-xxx.xml文件, 其中xxx是版本号, 当前(2022年10月)最新的版本是0.4.0。 把下载的xml文件导入到IRIS的任何命名空间。这样安装就成功了。

要下载安装软件的时候,您要先进入安装目标的命名空间(比如下面的USER),然后输入zpm, 也就进入了ZPM的操作界面: ZPM Shell

USER>zpm

=============================================================================
|| Welcome to the Package Manager Shell (ZPM).                             ||
|| Enter q/quit to exit the shell. Enter ?/help to view available commands ||
=============================================================================
zpm:USER>

输入help, 您可以看到帮助文件。(帮助文件很长, 我只贴一小段。)

zpm:USER>help -v

Available commands:
NOTE: [] around a parameter indicates it is optional
arrange [flags] [<module>]
  ■ Description: Rearranges the resources in a module manifest to follow the standard format
# 此处省略许多行
........
For more detail, run:
  help <command-name>
or
  help -v
zpm:USER>

接着, 我相信您一定想看看安装命令是怎么执行的,比如这样:

zpm:USER>help install
install [flags] <module> [<version>]
...此处省略若干行...
  ■ Examples
    ∙ install HS.JSON 1.x
      Installs the most recent 1.x version of HS.JSON available in any configured repository in the current namespace.
zpm:USER>quit
USER>

好吧,让我们来下载一个最受欢迎的开发者应用“webTerminal”,了解最基本的zpm操作。

最基本的ZPM操作

搜索package

输入zpm:USER>search或者, 您可以使用zpm:USER>search -r,“-r"显示数据包所在的repo的位置。我没有贴在这里是因为显示的内容太宽了。在我的帖子的代码框里显示看上去有点乱。

zpm:USER>zpm:USER>search
registry https://pm.community.intersystems.com:
alwo-goselector                                1.0.1
analytics-okr                                  1.0.0
...此处省略许多行...
zpm-shields                                    1.0.1
zpmhub                                         0.3.1
zpmshow                                        1.0.3
zpm:USER>

除了search, 还有个find命令。 它可以使用*,但无法忽略大小写。

zpm:USER>find *Webt*
registry https://pm.community.intersystems.com:

zpm:USER>find *webt*
registry https://pm.community.intersystems.com:
webterminal 4.9.6
zpm:USER>

安装package

zpm:USER>install webterminal
...(省略若干行)...
WebTerminal package successfully mapped into all namespaces.
[USER|webterminal]  Compile SUCCESS
[USER|webterminal]  Activate START
[USER|webterminal]  Configure START
[USER|webterminal]  Configure SUCCESS
[USER|webterminal]  Activate SUCCESS
zpm:USER>

到这里, 我来再次总结一下ZPM的最基本的功能:原本您想要使用一个其他开发者使用的程序,您要把它从某处,比如一个帖子,InterSystems的OpenExchange网站,或者一个github的主页上下载程序(XML文件),然后导入到IRIS执行。有了ZPM, 你可以在IRIS的terminal里通过ZPM命令,直接获得这个程序并执行。前提是:作者的程序是用ZPM打包并放在ZPM注册中心。

来先了解一下ZMP的注册中心

注册中心(Registry)

默认安装下, zpm的注册中心是这样的

zpm:USER>repo -list
registry
    Source:         https://pm.community.intersystems.com
    Enabled?        Yes
    Available?      Yes
    Use for Snapshots?  Yes
    Use for Prereleases?    Yes
    Is Read-Only?       No
    Deployment Enabled?     No

zpm:USER>

这也是当前zpm唯一的一个注册中心(配置私服会在后面介绍), 组册的软件包是最近一些年社区开发者写的各种工具和示例代码。说一下它的当前状况:

  • 当前能下载到278个软件包。
  • 所有的包都放在了github。
  • 包都很新。 这么说吧,release能到2.0的都是凤毛麟角

这里有个让人意外的事。我安装完webterminal并开始使用的时候,浏览器跳出这个提示。 “Welcome to WebTerminal! ...New update is available. ”。这说明这个registry并没有给出最新的webterminal版本。 我有点好奇,去看了一下webterminal的github page, 发现WebTerminal当前的版本是4.9.5。而zpm registry上下载的版本是4.9.2, 发行于2019年。

webterminal是一个前台工具,作者理所当然的的在代码里做了版本更新的检查并提醒了用户。而对于纯后台的ObjectScript语言的代码, 我估计大多数程序员都做不到这一点。 那么如果要保证其他人看到的是新版的软件, 就要求软件的作者,除了更新自己Github上的代码,还要把新版本及时更新在zpm的注册中心上。

文章太长了, 先贴一部分,后面会介绍

  • 软件的发布
  • 定义软件包的依赖
  • 配置私服

to be continued

讨论 (1)3
登录或注册以继续