JMP 插件是 JMP 核心功能的重要补充,有时,您可能会发现自己需要使用 JSL 自动创建插件。 我在构建 JMP 插件时使用了自动插件创建, JMP 到 R 自定义插件生成器。 这是自动创建加载项的一个漂亮的 JSL 技巧。
本教程中的代码改编自作者编写的精彩脚本@Justin_Chilton ,谁建造了自定义插件生成器。
JMP 插件 (.jmpaddin) 是一个 Zip 文件 (.zip)。 JMP 插件的三个最小组件是 addin.def 和 addin.jmpcust 文件,以及在使用插件时运行的 JSL 脚本。 您可以根据需要添加其他文件,例如其他 JSL 脚本、JMP 表格、PDF 或 Word 文档(通常用于文档)以及图片(通常用于加载项缩略图)。
在以下脚本摘录中,任何可自定义的内容均以大写字母表示(例如 YOUR_ADDIN_NAME)。
首先,创建 addin.def 文件中使用的字符串。 您将需要您的加载项名称和 ID。 名称是将显示在加载项菜单上的名称,ID 是加载项的唯一标识符,通常采用 com.companyname.username.addinname 格式。
//create string for addin.def file
addinDefString = "id=com.YOUR_COMPANY.YOUR_ID.YOUR_ADDIN_NAME
name=YOUR ADDIN NAME
supportJmpSE=0";
如果您知道您的加载项仅分别在 Windows 或 Mac 上受支持,那么您应该在此字符串的末尾添加一行:
"host=Win"
或者
“host=Mac”
接下来,为 addin.jmpcust 文件创建字符串:
addinjmpcustString = "\[<!-- JMP Add-In Builder created --><MENU_AND_TOOLBAR_CUSTOMIZATIONS jm="http://www.jmp.com/ns/menu" version="3">
<INSERT_IN_MAIN_MENU>
<INSERT_IN_MENU>
<NAME>Add-Ins</NAME>
<INSERT_AFTER>
<NAME></NAME>
<COMMAND>
<NAME>YOUR ADDIN NAME</NAME>
Your Addin Name
<ACTION type="path">$ADDIN_HOME(com.YOUR_COMPANY.YOUR_ID.YOUR_ADDIN_NAME)\YOUR_SCRIPT.jsl</ACTION>
<ICON type="none"></ICON>
</COMMAND>
</INSERT_AFTER>
</INSERT_IN_MENU>
</INSERT_IN_MAIN_MENU>
</MENU_AND_TOOLBAR_CUSTOMIZATIONS>]\";
然后,为了将 JSL 脚本打包为文件,首先将其作为文本文件加载:
addinScript = Load Text File("$SOME_PATH\YOUR_ADDIN_NAME.jsl");
然后,将所有文件写入 zip 存档:
//create a ZipArchive to write files to
za = Open("$DOCUMENTS\YOUR_ADDIN_NAME.jmpaddin", zip);
//write all necessary files to ZipArchive (which can also be binary blobs)
za << write("addin.def", addinDefString);
za << write("addin.jmpcust", addinjmpcustString);
za << write("YOUR_ADDIN_NAME.jsl", addinScript);
最后,您可以导航到保存文件的文件夹并查看您的加载项,双击即可安装该加载项。
我还创建了一个更加“填空”的脚本版本,以防您想要自动创建加载项(如果您需要创建多个加载项名称、文件、目录等),如下。
脚本中使用的两个变量名是addinName和dir,定义如下:
插件名称:作为字符串的加载项名称,其中包含空格和标题大写,如您希望它出现在加载项菜单中一样(例如“JMP to R Add-In Builder”)
目录:您要保存加载项的目录
addinDefStr = "id=com.YOUR_COMPANY.YOUR_ID" || addinName || "\!n name=" || addinName || "\!n supportJmpSE=0";
addinjmpcustStr = "\[<!-- JMP Add-In Builder created --><MENU_AND_TOOLBAR_CUSTOMIZATIONS jm="http://www.jmp.com/ns/menu" version="3">
<INSERT_IN_MAIN_MENU>
<INSERT_IN_MENU>
<NAME>Add-Ins</NAME>
<INSERT_AFTER>
<NAME></NAME>
<COMMAND>
<NAME>]\" || uppercase(addinName) || "\[</NAME>
]\" || addinName || "\[
<ACTION type="path">$ADDIN_HOME(com.jmp.]\" || lowercase(regex(addinName, "\s", "", globalreplace)) || "\[)\]\" || addinName || "\[.jsl</ACTION>
<ICON type="none"></ICON>
</COMMAND>
</INSERT_AFTER>
</INSERT_IN_MENU>
</INSERT_IN_MAIN_MENU>
</MENU_AND_TOOLBAR_CUSTOMIZATIONS>]\";
addinScript = Load Text File("$SOME_PATH\YOUR_ADDIN_NAME.jsl");
//create a ZipArchive to write files to
za = Open(dir || "/" || addinName || ".jmpaddin", zip);
//write all necessary files to ZipArchive (which can also be binary blobs)
za << write("addin.def", addinDefStr);
za << write("addin.jmpcust", addinjmpcustStr);
za << write(addinName || ".jsl", addinScript);
希望这些脚本可以帮助您的插件创建项目更加顺利!
您可以尝试对脚本进行编辑->加密。 进行一些测试并准备好返工一些 JSL。 如果您只有一小部分秘密代码,请考虑将其移动到自己的包含文件中并对其进行加密。 其余代码将正常运行。
加密的脚本很难自我审视;如果您使用表达式操作或将表达式转换为字符串,则需要进行一些重写。 使用显示全局变量();脚本运行后了解可能泄漏的内容。
将纯文本版本保存在安全的地方!
JMP 插件 (.jmpaddin) 是一个 Zip 文件 (.zip)。 JMP 插件的三个最小组件是 addin.def 和 addin.jmpcust 文件,以及在使用插件时运行的 JSL 脚本。
我们希望向供应商提供一个加载项,但希望与其关联的代码保密。 上面的声明表明代码是可见的。 有没有什么方法可以以二进制形式制作外接程序,这样就不能(轻松)对其进行逆向工程?
@vince_faller中,“supportJmpSE”中的“SE”代表“学生版”,因此如果您需要该插件与 JMP 学生版配合使用,则只需将其设置为 1。
感谢您将这些放在一起,朱莉娅!
我只是想添加一些可以添加到 addin.def 文件中的选项。
- addinVersion - 显示在“视图”>“加载项...”对话框中的版本号。
- minJmpVersion - 插件可安装的 JMP 最低版本。
- maxJmpVersion - JMP 的最大版本可以安装该插件。
addinVersion=1.3
minJmpVersion=12
maxJmpVersion=13
如果您有兴趣在加载项中使用 JMP 的内置图标之一作为菜单项,请查看我的内置 JMP 图标加载项的图标名称,并在 addin.jmpcust 文件中使用以下格式。
<jm:icon type="builtin">JMPProSmall</jm:icon>