假设我的模块发生了一些更改,所以我不得不更新服务程序,结果签名发生了更改。那么我不应该选择哪一种呢?我应该使用CRTPGM或UPDPGM来重新创建使用服务程序的程序吗。在这种情况下,你能说出CRTPGM和UPDPGM之间的区别吗。
首先,您不应该仅仅因为*SRVPGM发生了更改就需要CRTPGM或UPDPGM。由于*SRVPGM的更改,要求*PGM重新编译应该是一个非常罕见且非常有意的决定。
听起来你可能在使用CRTSRVPGM EXPORT(*ALL)
,不要这么做。相反,使用绑定源CRTSRVPGM EXPORT(*SRCFILE) SRCFILE(..)
来控制导出的过程和服务程序签名。硬编码签名的简单方法
STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
ENDPGMEXP
现在,您可以将过程添加到服务程序中,只要将导出添加到末尾,就可以保持相同的签名,而不会强制重新编译使用该服务程序的任何程序。
STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
export symbol('Proc3')
export symbol('Proc4')
ENDPGMEXP
在这种情况下,您不能删除或重新排序导出。
如果您确实需要确保所有调用程序的重新编译,那么只需更新硬编码签名即可。
STRPGMEXP SIGNATURE('MYSRVPGM Sig v2')
export symbol('Proc1')
export symbol('Proc3')
export symbol('Proc4')
ENDPGMEXP
另一种选择是让系统生成签名,并使用*CURRENT
和*PRV
块。但是,在不中断现有调用程序的情况下,您仍然无法删除或重新排序导出。因此,社区的共识是简单地对签名进行硬编码。IBM自己在操作系统中包含*SRVPGM对象时也遵循这种做法。
要认识到的两件重要的事情是
- 过程签名(参数的数量和类型(与*SRVPGM签名无关
- 过程名称被解析为"0";绑定";*PGM对象的时间,在执行过程中,调用实际上是按位置进行的
例如,如果我有这个
dcl-pr Proc1 extproc(*dclcase);
parm1 char(10);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
parm1 char(20);
end-pr;
具有粘合剂源
STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
ENDPGMEXP
我能做这个
dcl-pr Proc1 extproc(*dclcase);
parm1 char(10);
parm2 char(20) option(*nopass);
end-pr;
dcl-pr Proc2_depreciated extproc(*dclcase);
parm1 char(20);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
parm1 varchar(100) const;
end-pr;
具有粘合剂源
STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2_deprecated')
export symbol('Proc2')
export symbol('Proc3')
ENDPGMEXP
现有的*PGM调用Proc2()
将继续调用现在重命名为Proc2_deprecated()
的代码。调用Proc2()
的新的或重新编译的现有*PGM将调用名为Proc2()
的新添加的代码。
现在为您的问题提供一个不完整的答案,
CRTPGM和UPDPGM之间有什么区别?
我很确定存在差异,我知道当使用UPDSRVPGM而不是CRTSRVPGM时,*SRVPGM对象中的一些元数据不会更新。我敢打赌乌干达人民国防军也是如此。此外,CRTPGM有一个参数Allow *SRVPGM library update . . ALWLIBUPD
,默认为*NO
,因此如果您更新的服务程序在另一个库中,则可能必须使用CRTPGM。
老实说,在平台上的30年里,我从未使用过UPDPGM或UPDSRVGM。大多数时候,我的*PGM是单个模块,使用绑定目录来查找*SRVPGM,因此通过CRTBNDRPG重新创建就足够简单了*SRVPGM要么是单个模块,要么具有特定于其创建的唯一绑定目录。
我在职业生涯中使用的变更管理工具也重新创建了对象,而不是使用UPDPGM或UPDSRVGM。
最后,如果你是ILE和*SRVPGM的Scott Klement的ILE Concepts(针对不耐烦的RPG程序员(演示是一个老掉牙但很好的东西。