ZPM介绍(2)

news2024/12/23 6:47:10

发布您自己的软件

首先:要发布您的软件,您要支持这个”命名规范。其中和zmp最相关的是包名和l类名的设计,你要定义成这样:

company.project.subpackage.TheClass.cls

如果您的Package Name定义是: Company.Project, 有大写字母,对不起,是无法用zpm打包的。

这个链接给了最简单的例子,但还不详细,我来总结一下:

发布您的软件前,有几件事情要了解:

  1. zpm的注册中心并不存代码,存的只是一个到您代码的链接。因此,您得找地方放您的代码。当前最常用的是github。

  2. 文件目录的结构

    举例:有一个class定义是 com.tony.Test1.cls, 你的目录应该这么组织,假设您要放在 /myDemo, 那么class应该在/myDemo/src/com/tony/Test1.cls。这是使用VSCode组织代码的默认方式,只有保证这样的目录结构,您才可能用zpm加载代码到iris.

让我来做个简单的例子。

首先,有这样的class:

Class com.tony.Test1
{   Property p1;
}

我的文件目录设置

$ ls -l /external/myDemo/src
total 4
-rw-r--r-- 1 irisowner irisowner 40 Nov 12 10:00 Test1.cls
$

这时候我来使用zpm打包测试

module.xml的生成和加载

第一步,生成module.xml

我们看看最简单的用zpm generate命令生成module的例子:

zpm:USER>generate /external/myDemo/project1

Enter module name: project1
Enter module version: 1.0.0 =>
Enter module description:
Enter module keywords:
Enter module source folder: src =>

Existing Web Applications:
    /csp/user
    /terminal
    /terminalsocket
    Enter a comma separated list of web applications or * for all:
Dependencies:
    Enter module:version or empty string to continue:
zpm:USER>

zpm generate会把/external/myDemo/project1目录下的文件打包,在这个目录下创建一个module.xml文件, 是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25">
  <Document name="project1.ZPM">
    <Module>
      <Name>project1</Name>
      <Version>1.0.0</Version>
      <Packaging>module</Packaging>
      <Resource Name="com.PKG" />
      <SourcesRoot>src</SourcesRoot>
    </Module>
  </Document>
</Export>

先等等解释这个xml, 让我们先执行第2步。

第2步: 把文件load到iris

zpm:USER>load /external/myDemo/
[USER|firstdemo]    Reload START (/external/myDemo/)
[USER|firstdemo]    Reload SUCCESS
[firstdemo] Module object refreshed.
[USER|firstdemo]    Validate START
[USER|firstdemo]    Validate SUCCESS
[USER|firstdemo]    Compile START
[USER|firstdemo]    Compile SUCCESS
[USER|firstdemo]    Activate START
[USER|firstdemo]    Configure START
[USER|firstdemo]    Configure SUCCESS
[USER|firstdemo]    Activate SUCCESS
zpm:USER>

您去iris里看看, 确认class已经被loaded

第3步: 删除(optional, 但你可能会用到这个命令)

zpm:USER>uninstall firstdemo

[USER|firstdemo]    Clean START
[USER|firstdemo]    Unconfigure START
[USER|firstdemo]    Unconfigure SUCCESS
Deleting class com.tony.Test1
[USER|firstdemo]    Clean SUCCESS
zpm:USER>

这时候您应该可以发现com.tong.Test1类已经从Iris删除了。

对上面的例子总结一下:

  1. 打包是对一个文件夹打包

  2. 使用zpm把软件包加载进iris是先找包里面的module.xml文件。通过module.xml里定义的信息来知道包的名字,版本,打包的内容等等。 这个module.xml是在打包的时候用zpm generate创建的, 但您也可以自己手工创建,比如copy其他包的module.xml改改, 有时候会更快捷,尤其是您对zpm命令不是很熟悉的时候, 对很多打包的需求,比如后面会提到的定义依赖等等,直接改module.xml比zpm generate容易多了。

  3. 让我来说说可能的问题:

    module.xml中<Resource Name="com.PKG"/>定义了包名com.PKG, 加载数据包到iris很成功。但是,如果您还记得,刚刚例子里打包的是class是com.tony.Test1,那么如果你再定义一个新的类,叫com.tiedan.Test1, 用zpm generate一个新module, 名字叫project2(注意第一个打包的module名字是project1), project2的"Resource Name"也还是"com.PKG, 它能正确加载吗?

    不会, 你会被告知:"ERROR! Resource 'com.PKG' is already defined as part of module 'project1'; cannot also be listed in module 'project2'"

​ 解决方法:手工将module.xml里面的Resource Name改成“com.tony.PKG"和"com.tiedan.PKG", 这样两个包都能成功加载了。

还有个小问题,Mac用户可能会看到这样的提示:

zpm:USER>load /external/myDemo/project1

[USER|project1] Reload START (/external/myDemo/project1/)
[project1] Reload FAILURE
ERROR! Unable to import file '/external/myDemo/project1/src/com/.DS_Store' as this is not a supported type.
zpm:USER>

这是说打包的文件夹下面有.DS_Store文件,而zpm不认识。zpm会把里面认识的文件, 比如.cls文件成功加载, 然后告诉你"Roload FAILURE"

好吧, 到这里我们知道怎么打包和把包加载到iris里, 接着看看什么文件可以被打包。

Package可以包含的文件类型

这时候要好好了解module.xml的内容的细节了, 请阅读技术文档的module.xml部分。

其中的resource部分,阐明了您可以打包的内容:

第一部分:可以被加载到iris的文件类型。

Use the following suffixes for different types of resources:

.PKG - Package
.CLS - Class
.INC - Include
.MAC - Routine
.LOC - LocalizedErrorMessages
.GBL - Global
.DFI - DeepSee Item

第二部分:jar包

<FileCopy Name="lib/" Target="${libdir}my-lib/"/>               Copies content of lib folder to Target
<FileCopy Name="somefile.jar" Target="${libdir}my-lib/"/>       Copies just desired file to Target

第三部分:UnitTest

module.xml的例子里给出的UnitTest部分是这个样子

<UnitTest Name="/tests/unit_tests/" Package="Test.Unit" Phase="test"/>

说实话,我还没研究怎么使用zpm generate可以做到这一点,能想到的就是手工去修改module.xml文件。

第四部分:Web Application

执行zpm generate的时候, 会列出当前命名空间可以使用的Web Application列表。让我重新执行一下打包的第一步,看看结果是什么样子

zpm:USER>generate /external/myDemo/project1

Enter module name: project11
Enter module version: 1.0.0 =>
Enter module description:
Enter module keywords:
Enter module source folder: src =>

Existing Web Applications:
    /csp/user
    /terminal
    /terminalsocket
    Enter a comma separated list of web applications or * for all: /csp/user
    Enter path to csp files for /csp/user: 
Dependencies:
    Enter module:version or empty string to continue:
zpm:USER>

得出的module.xml里多了如下内容:

<CSPApplication CookiePath="/csp/user/" DefaultTimeout="900" DeployPath="${cspdir}user/" Description="User Namespace applications" GroupById="%ISCMgtPortal" MatchRoles=":{$dbrole}" PasswordAuthEnabled="1" Recurse="1" ServeFiles="2" ServeFilesTimeout="3600" UnauthenticatedEnabled="1" Url="/csp/user" UseSessionCookie="2"/>
      <SourcesRoot>src</SourcesRoot>

其中,打包时提问`Enter path to csp files for /csp/user:。 这里,您需要填入的是当前要load的csp文件。比如:您有一个tony.csp要加载,那么您可以在要打包的目录下创建一个子目录“cspfiles", 把tony.csp放在cspfiles目录里, 回答提问的使用这样

Enter path to csp files for /csp/user:/cspfiles

这里用的是相对路径,但格式是绝对路径的格式,我把它看成一个bug。

module.xml中还有其他很多配置的内容,我在后面会介绍包的依赖的部分。

软件包的Package

用package命令,在iris里将软件打包。打包的结果是得倒一个project1-1.0.0.tgz的文件。 package -v显示verbose信息,您可以清楚的看到project1-1.0.0.tgz和module.xml的存放位置。

zpm:USER>project1 package -v

[USER|project1] Reload START (/external/myDemo/project1/)
Skipping preload - directory does not exist.
Load of directory started on 11/20/2022 13:15:17 '*'

Loading file /external/myDemo/project1/src/com/tony/Test1.cls as udl
Load finished successfully.

[USER|project1] Reload SUCCESS
[project1]  Module object refreshed.
[USER|project1] Validate START
[USER|project1] Validate SUCCESS
[USER|project1] Compile START
Compilation started on 11/20/2022 13:15:17 with qualifiers 'd-lck'
Compiling class com.tony.Test1
Compiling routine com.tony.Test1.1
Compilation finished successfully in 0.008s.

[USER|project1] Compile SUCCESS
[USER|project1] Activate START
[USER|project1] Configure START
[USER|project1] Configure SUCCESS
Studio project created/updated: project1.PRJ
[USER|project1] Activate SUCCESS
[USER|project1] Package START
Exporting 'com.tony.Test1.cls' to '/usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/src/com/tony/Test1.cls'
Exported to /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/module.xml
Module exported to:
    /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/

Module package generated:
    /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0.tgz
[USER|project1] Package SUCCESS
zpm:USER>

软件包的Publish

我们并没有权限把软件包直接发布到官方的registry去。您需要去InterSystems的OpenExchange页面,提交您的软件包。如下图填入软件包的信息,Github URL, 注意勾选右下角的"Publish in Package Manager" 。

image

后面, 我会介绍怎么创建自己team的私服, 用zpm publish可以简单的把iris的软件包发布到私服上去,这对一个开发团队共享软件包并方便部署应该是更有吸引力些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

元数据管理-解决方案调研二:元数据管理解决方案——Saas/内部解决方案(3)

Saas/内部解决方案 2.10、Netflix Metacat Metacat 是一种元数据服务&#xff0c;使数据易于发现、处理和管理。在 Netflix&#xff0c;数据仓库由存储在 Amazon S3&#xff08;通过 Hive&#xff09;、Druid、Elasticsearch、Redshift、Snowflake 和 MySql 中的大量数据集组…

【Linux入门指北】文件服务器

文件服务器 文章目录文件服务器一、FTP Server1.简介2.FTP Server 默认配置3.FTP Clinet4.vsftpd的主动和被动模式二、NFS Server1.简要介绍2.环境配置3.关闭防火墙4.nfs(存储端)5.web1 web2 web3 客户端5.1 安装NFS客户端5.2 开启httpd服务5.3 查看存储端共享5.4 手动挂载5.5 …

电容笔哪个牌子好?2022年电容笔十大品牌排行榜

当电容笔搭配上了ipad&#xff0c;可以大大提升我们的工作效率&#xff0c;不会变得乏味。对于那些对绘画要求很高的人来说&#xff0c;电容笔在绘画中的作用更是不容忽视的。其实我个人对电容笔这块了解还不少的&#xff0c;有着许多平替电容笔都支持在ipad上使用的&#xff0…

社会工程攻击依然是企业面临的最大威胁

企业进入数字化时代&#xff0c;网络攻击行为无处不在&#xff0c;利用社会工程攻击已成黑客的惯用手段。研究表明&#xff0c;91%的网络攻击是通过社会工程手段完成的。 常见的社会工程攻击手段有哪些&#xff1f; 网络钓鱼&#xff1a; 这是经典手段&#xff0c;大多数的钓…

HTML5期末大作业:基于html企业官网项目的设计与实现【艺术官网】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Alien Skin Exposure2023调色滤镜插件RAW后期处理软件

Exposure既可以作为ps、lr的插件使用&#xff0c;也可以单独作为一款专业的图像编辑器使用&#xff0c;它可以处理RAW格式的照片&#xff0c;拥有500多种预设滤镜&#xff0c;还有照片管理和添加文字水印等功能。可以说&#xff0c;无论是新手还是设计师和摄影师&#xff0c;都…

【POJ No. 2431】 丛林探险 Expedition

【POJ No. 2431】 丛林探险 Expedition 北大OJ 题目地址 【题意】 一群人开着一辆卡车冒险进入丛林深处&#xff0c;卡车油箱坏了&#xff0c;每走1米就会漏1升油&#xff0c;他们需要到最近的城镇&#xff08;距离不超过106米&#xff09;修理卡车。卡车当前位置和城镇之间有…

怎么将视频转化为gif?

如何将视频转化为gif&#xff1f;gif是一种大家平时常见的动态图片格式&#xff0c;动图是一种非常有意思的图片种类&#xff0c;gif一般都是一些非常有意思的小动图&#xff0c;例如我们在群聊时使用的动态表情包&#xff0c;还有一些球迷朋友喜欢看的足球进球动图等。gif动图…

asp核酸检测预登记系统源码

用asp开发的核酸检测预登记系统上线了&#xff0c;用户填写姓名&#xff0c;手机&#xff0c;身份证号&#xff0c;地址等信息后生成一个加密的二维码&#xff0c;管理员扫码后可以得到真实的二维码文字信息。主要为方便核酸采集统计托底等&#xff0c;也可以用作会议入场信息采…

【NLP】使用 PyTorch 通过 Hugging Face 使用 BERT 和 Transformers 进行情感分析

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

初识Kafka构造组成

在刚学习kafka的时候&#xff0c;有时候会比较纳闷broker是什么&#xff1f;topic又是什么&#xff1f;一台机器上有多少broker&#xff1f;又有多少的topic和partition&#xff1f;由下面这张图来初识我们的kafka&#xff1a; 上图中包含了一个kafka集群的所有组件&#xff1a…

大数据毕业设计题目推荐 毕设选题大全

文章目录0 前言1 如何选题1.1 选题技巧&#xff1a;如何避坑(重中之重)1.2 为什么这么说呢&#xff1f;1.3 难度把控1.4 题目名称1.5 最后2 大数据 - 选题推荐2.1 大数据挖掘类2.2 大数据处理、云计算、区块链 毕设选题2.3 大数据安全类2.4 python大数据 游戏设计、动画设计类2…

LeetCode-808. 分汤【动态规划,概论与统计,记忆化搜索】

LeetCode-808. 分汤【动态规划&#xff0c;概论与统计&#xff0c;记忆化搜索】 题目描述&#xff1a;解题思路一&#xff1a;动态规划&#xff0c;这里将所有的汤除了25&#xff0c;缩小数值。自底向上解题思路二&#xff1a;记忆化搜索&#xff0c;自顶向下搜索&#xff0c;会…

R summarize()分组摘要

summarize()分组摘要分组平均值最大最小值计数 library(nycflights13) library(tidyverse)summarize()可以将数据折叠成一行 如果不与group_by()一起使用&#xff0c;那么summarize()也没什么用 summarize(flights, delay mean(dep_delay, na.rm TRUE))delay12.63907 group…

基于PHP+MySQL仓库管理系统的设计与实现

PHP&#xff1a;MySQL仓库管理系统的设计与实现是一个集合了中小型超市所有特点的一个管理系统, 它使用当下最流行的PHP语言来进行开发,实现了管理员登录,员工登录,超市内物资基本信息管理,进货信息管理,销售信息管理,超市内员工信息管理,查询统计等功能, 通过这些功能可以让超…

Kubernetes云原生实战01 Kubernetes高可用部署架构

大家好&#xff0c;我是飘渺。从今天开始我们将正式开始Kubernetes云原生实战系列&#xff0c;欢迎持续关注。 Kubernets核心组件 Kubernetes中组件众多&#xff0c;要完全介绍清楚估计要写上厚厚一本书&#xff0c;我们实战系列主要记住几个核心组件就行&#xff0c;即两种节…

【LeetCode每日一题:808.分汤~~~边界条件的特判+记忆化搜索】

题目描述 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。 提供 75ml 的 汤A 和 25ml 的 汤B 。 提供 50ml 的 汤A 和 50ml 的 汤B 。 提供 25ml 的 汤A 和 75ml 的 汤B 。 当我们把汤分配给某人之后…

vue3项目,vite+vue3+ts+pinia(10)-elementplus布局

项目创建好,接下来引入Container 布局容器, 在src下新建layout文件夹, layoutName.vue <template><el-container><el-aside width"200px">aside</el-aside><el-container><el-header>Header</el-header><el-main>…

CompletableFuture异步编程Api使用详解

Java 8 引入了很多的新特性&#xff0c;其中就包含了 CompletableFuture 类的引入&#xff0c;它允许我们通过在与主应用程序线程不同的线程上&#xff08;也就是异步&#xff09;运行任务&#xff0c;并向主线程通知任务的进度、完成或失败&#xff0c;来编写非阻塞代码。 Fu…

LVS-DR模式部署

目录 一、环境准备 1、DR模式介绍 2、DR模式工作原理 3、服务器准备 二、实验拓扑 三、配置网络环境 1、配置调度器网络环境 2、配置Web服务器网络环境 四、创建LVS-DR集群 1、创建LVS集群 2、添加Real Server 3、查看lvs配置 五、LVS服务器开启路由转发 六、效果…