我有一个大型的IDL代码生态系统,主要使用自定义对象实现,可以在cron或后处理任务中构建大量不同的应用程序并作为常规作业运行。目前,每个“应用程序”都是从一个脚本运行,该脚本首先根据需要填充!路径,然后运行所需的顶级过程。编译即时进行。这在版本控制方面变得有点痛苦(即确保没有人触及cron作业所需的操作代码,而是处理开发代码,但记得将更改推送到操作区域)。显然,为每个应用程序构建.sav文件会更有效,从而允许在修改完成后更自由地更改代码以更改.savs(更不用说运行时节省而不必不断地重新编译相同的代码)每次运行每个脚本时都重复一遍)。
现在,我遇到的问题是确保将所有必需的模块编译到.sav文件中。简单编译顶级例程然后使用RESOLVE_ALL似乎不起作用,因为它错过了许多对象(即当我恢复.sav并运行代码时,更多例程被编译为不在.sav中)。看看文档,看起来IDL并不能很好地解析对象定义。 RESOLVE_ALL有一个CLASS关键字可以解决这个问题,但是你需要手动列出要编译的类,这就违背了IDL首先解决例程的要点。即使运行脚本一次以确保编译所有内容也不起作用,因为偶尔会出现边缘情况导致需要某些对象,在正常运行中不需要,因此这不是确保所有例程的可靠方法得到了解决。
我确实在https://www.idlcoyote.com/tips/compile.html的David Fannings页面上看到了一个用户编写的RESOLVE_EVENMORE例程,该例程看起来很有希望,但代码的链接似乎已经死了。
有人能建议一个好方法吗?
我真的更愿意避免为这些应用程序中的每一个创建工作台项目,因为它们有很多并且我希望能够为所有应用程序进行全局更改,例如更改代码的存储位置通过为所有这些部署特定信息创建引用环境变量的构建脚本,可以轻松实现。基本上,我想要IDL相当于GNU Make。
答案 0 :(得分:1)
[编辑澄清] 您可以使用FILE_SEARCH查找特定应用程序目录和所有子目录中的所有.pro代码[不是IDL&!s!路径中的所有内容,只是您自己的应用程序目录]。然后循环遍历每个文件并使用RESOLVE_ROUTINE,其中包含文件名(减去.pro)给出的例程的名称。您可能需要一个catch块来忽略任何编译错误,您可能需要一个要跳过的文件列表。最后,使用RESOLVE_ALL来获取IDL的lib目录中可能需要的任何内容。
使用此方法,只要您的所有代码都在某个顶级目录中,您就会得到保存文件中所需的所有内容。