如何在VMWare VRO任务中嵌入RRULE JS库

rsa*_*rns 5 javascript rrule underscore.js

我正在尝试在VMWare VRO中创建一个自定义操作,该操作使用JS作为其脚本逻辑。我试图将两个库嵌入到单个代码块中,以便可以使用它们。不幸的是,VRO本身没有使用包含或库的概念,因此所有这些都必须放在同一巨型脚本块中。

我想使用这个RRULE JS库:

https://github.com/conrad-vanl/rrule

我可以将其嵌入一个代码块中没问题。但这取决于下划线库。

https://github.com/jashkenas/underscore

没有抛出以下错误,我似乎无法嵌入其中:

TypeError:无法从未定义(未命名的脚本#2293)读取属性“ n”

我想这与下划线库的格式化方式有关。这是我目前试图同时嵌入两者的要点。

https://gist.github.com/rsaturns/aceceabb87fc28879ffdb214425a2a15

如果我可以将RRULE和Underscore库都嵌入到同一文件中,我想我将能够使它正常工作。

小智 0

VRO 不使用常规 JavaScript 引擎,例如在浏览器或服务器端 Node.js 中运行的引擎。它使用基于 Java 的 Rhino 引擎,因此它与常规 JavaScript 有很多奇怪的差异。

与常规 JS 相比,语法和行为有相当多的差异,因此可以预见,很多您认为应该有效的东西在 VRO 中将不起作用。

VRO js 的一些限制:

  • JS 功能基本停留在 ES5,但 ES5 的某些功能甚至还没有实现。
  • 并非所有 API 在 VRO 中都可用,并且某些对象、方法或函数已被替换为等效项(Console.log 相当于 VRO 中的 System.log)
  • 您通常不能使用外部 JS 库,例如 axios、jQuery、lodash 等...(您可以尝试通过多种方式绕过此限制,我将对此进行解释)

如果您想在 VRO 中使用外部库,则需要考虑一些事项,但以下是最重要的:

  • 库所依赖的 JS 版本。
  • 该库依赖的 API 和 JS 功能。

如果您的库基于 ES5 之前的 JavaScript,并且不使用任何特殊的、特定于浏览器的或特定于 Node.js 的 API,那么它应该可以在 VRO 中开箱即用。

如果没有,那么您可以尝试一些方法来让它在 VRO 中工作:

  • 使用转译器(如果需要,还可以使用捆绑器)(例如 Babel+Webpack、SWC、Esbuild 等)将要使用的旧版本 JS 库的源代码降级为单个 JS 文件。
  • 如果您使用某些浏览器或 Node.js API,您可能需要使用 polyfill,因为即使经过转译和降级,它们也无法在 VRO 中工作。
  • 将生成的 JS 代码放入您想要使用它的同一个 VRO 工作流程/操作中并直接使用它(我不推荐这样做,因为它很快就会变得一团糟并且不可读)
  • 将生成的 JS 代码放入 VRO 资源元素中,然后在 VRO 工作流程/操作中,获取此资源元素的内容(此时它将是一个字符串)并使用eval()Function解析和评估库代码。然后它将可以在工作流程/操作的其余部分中使用。(我推荐这种方法,因为它最不容易出错,只需要1-3行代码,并且更具可读性)
  • 您可以做同样的事情,但另外将库代码分割成尽可能多的较小的工作模块/对象/函数,以获得更好的性能,并在处理大文件时可能解决 VRO 的限制。

一般来说,这对我有用,但我不能保证它在所有情况下都有效。由于 Rhino 引擎的怪异性质和 VRO 的限制,您可能会遇到其他问题或限制,并且无法使用您想要使用的 JS 库。例如,如果您的库代码太大,VRO 将无法使用它,因为它将耗尽内存,或者工作流程/操作将崩溃,或者它会中途停止评估库代码而变得无用。

还有另外 2 种方法可以在 VRO 工作流程/操作中使用外部库,但它们不使用普通的 VRO 引擎。请记住,使用这种方式,您无法直接访问所有 VRO API,例如资源元素、插件等。所以它有一些局限性:

  • 使用 VRO 的 Node.js 运行时而不是默认运行时 (Rhino) 来编码您的工作流程/操作。您可以通过这种方式使用外部和常规 Node.js 库(例如 lodash),而无需对其进行转译、捆绑或降级。(这是使用外部库的最佳方式,因为它们应该像您在 JS 中所期望的那样工作)。有两种方法可以执行此操作,并且文档对于详细解释非常有用:https://docs.vmware.com/en/vRealize-Orchestrator/8.10/com.vmware.vrealize.orchestrator-using-client-guide .doc/GUID-13E3704E-A325-4CB1-AF57-45FEBDBBD159.html
  • 您可以编写一个微服务或使用您需要的所有 JS 库的东西,并将它们作为 REST api 在某个托管的服务器中公开,然后从您的 VRO 工作流程/操作中调用这些端点。(这需要最多的努力,但实际上并不是建议用于简单脚本编写)

我希望这对将来需要做类似事情的人有所帮助,因为我花了很长时间的尝试和错误才达到这一点。