加载项管理器描述
加载项管理器使您能够轻松构建和重新构建加载项文件、随着时间的推移管理加载项的版本、直接访问源文件以及对加载项进行额外的自定义。 现在有了 2.0 版加载项管理器,您可以控制整个 JSL 应用程序开发生命周期,因为您可以直接从加载项管理器!
快速构建加载项
的基本特征加载项管理器是直接从源文件构建 JMP 插件文件的能力。 此功能最初包含在我的自定义加载项生成器加载项和加载项管理器已经采用了该插件的基础知识并对其进行了改进。

向用户部署加载项
随着版本 2.0加载项管理器,您现在可以直接从加载项管理器. 您可以部署到 TEST 位置以供用户测试您的加载项,也可以部署到 PROD 位置。

部署到 PROD 时,带有关联数组的 JSL 脚本会自动更新为最新的发布日期/时间。 此关联数组可由自动生成的“updateCheck.jsl”脚本使用,该脚本可以根据关联数组将用户加载项的构建日期与构建日期进行比较。 如果有更新版本的插件可用,用户将看到以下窗口,他们可以在其中选择更新到最新版本。 这个使用关联数组检查更新的概念改编自@brady_brady的使用带有发布日期的表格的方法。 该方法在@Jeff_Perkinson的帖子如何编写自更新 JMP 插件.

管理加载项的版本
加载项管理器每次构建新文件时,都能够自动保留加载项文件的版本历史记录。 它允许您安装、恢复或删除以前版本的加载项。 您可以选择为每个构建添加注释,以便跟踪每个版本的更改。

进行额外的插件自定义
加载项管理器允许您对以前需要手动更改 XML 的加载项进行一些自定义。 以下是可用的额外自定义加载项管理器.
- 最大 JMP 版本
- 菜单项的内置 JMP 图标
- 在位置之前插入以指定菜单项的位置
- 自定义菜单栏 - 创建您自己的菜单或使用“加载项”以外的现有菜单
- 新进加载项管理器2.0:单个加载项中的多个主菜单

直接从 JMP 访问源文件
在文件选项卡上加载项管理器,您可以通过双击表格中的所需文件直接从 JMP 打开源文件夹中的文件。

自定义元数据的自动管理
和加载项管理器2.0 版,除了自动包含和管理的元数据之外,您还可以创建自己的自定义元数据加载项管理器.

管理以前安装的加载项
在已安装选项卡中,您可以启用、禁用或注册已安装的插件以及注册未安装的插件。

系统要求
此插件在装有 JMP 13 或更高版本的 Windows 和 Mac 操作系统上受支持。
博客系列
插件管理器,第 1 部分:定义和构建 JMP 插件
加载项管理器,第 2 部分:为用户部署自动更新加载项
加载项管理器,第 3 部分:高级自定义
变更日志
版本 1.1-1.3(2017 年 10 月 16 日)
- 修复了一些导致加载项抛出错误的情况
- 添加了用于控制是否显示菜单和工具栏的新首选项
2.0 版(2017 年 11 月 22 日)
- 添加了对将加载项部署到 TEST 和 PROD 位置的支持。
- 通过可以包含在脚本中的关联数组添加了对自定义元数据的支持。
- 添加了在单个加载项中拥有多个主菜单的功能。
- 添加了在菜单项树中复制和粘贴菜单项的功能。
- 添加了对从现有的“jmpaddin”文件建立源文件夹的支持。
- 添加了检查新版本的功能,直接从 JMP 社区中提取。
- 添加了在构建后自动安装加载项的首选项。
- 由于各种原因,删除了对一次构建多个加载项的支持。
- 压扁了其他各种错误。
2.1 版(2018 年 2 月 26 日)
- 添加了排除不可见文件和文件夹(即以句点开头的文件/文件夹)的首选项。 如果您使用的是版本控制系统,例如 Git,这将非常有用。
- 在确定您是否安装了最新版本时,现在会忽略 customMetadata.jsl 文件。
2.2 版(2018 年 3 月 8 日)
- 修复了添加两个以上顶级主菜单时的问题。
- 在选择屏幕中添加了新图标。 删除的图标仅在一个操作系统上可用。
2.3 版(2018 年 4 月 6 日)
- 修复了在 Mac 上重命名或删除源文件夹时导致的错误
- 即使您的计算机上没有安装 Consolas 字体,首选项窗口现在也可以工作。
2.4 版(2020 年 1 月 9 日)
- 允许在其他项目之前或之后插入菜单项,而不是只允许在之后插入。
- 添加 15 和 16 作为最小/最大 JMP 版本号。
2.5 版(2020 年 2 月 5 日)
- 在 JMP 15 中使用 macOS 深色模式和 Windows 高对比度模式时提高可读性。
- 修复在 Mac 上打开首选项时显示的警报。
2.6 版(2020 年 6 月 4 日)
- 修复了使用自定义菜单解析加载项的错误。
- 添加了用于解析错误的诊断信息,以帮助解决未来的问题。
2.7 版(2020 年 6 月 10 日)
2.8 版(2020 年 9 月 24 日)
- 修复了使用子文件夹解压缩加载项的问题
- 添加了使用加载项模板时自动创建文件夹的选项(默认启用)。
2.9 版(2021 年 2 月 4 日)
- 将某些日期格式更改为区域设置格式
- 修复了检查更新功能
3.0 版(2022 年 1 月 18 日)
- XML 特殊字符(例如 '&')不应再破坏 addin.jmpcust 文件。
3.1 版(2022 年 3 月 4 日)
如果您发现任何问题,请告诉我!
当前版本=3.1
2.9
加载项管理器使您能够轻松构建和重新构建加载项文件、随时间管理加载项的版本、直接访问源文件、对加载项进行额外自定义以及将加载项部署到你的用户。

实用程序回复:加载项管理器@贾斯汀_奇尔顿JMP17 为我的插件显示空菜单结构,其中 JMP16 显示菜单项。 这三个插件都是一样的。 请参阅我之前 2021 年 9 月 14 日的消息。

回复:加载项管理器@贾斯汀_奇尔顿, @内森克拉克我终于回到了我的测试插件自动更新功能。 我想我确实让它运行正常,只是加载项管理器没有为测试设置写出元数据文件夹。
有机会启用此功能吗?否则每次都需要手动更新这些文件,这很容易出错。
亨宁
回复:加载项管理器你好@贾斯汀_奇尔顿
在发布问题后尝试各种事情时,我怀疑文件被内部行业安全系统损坏。
当我从外部收到文件并继续重新安装时,它已正常安装。

我将保留同一案例的问题和答案。
永远感谢你,贾斯汀
Dave_Ryu。
回复:加载项管理器你好@贾斯汀_奇尔顿
我收到了很多使用加载项管理器构建的帮助。
我一直使用它直到 v2.9,但重新安装时出现以下错误。
在 v2.9 和最新版本的 v3.1 中都会出现此错误。
当我运行安装文件时,立即出现错误并且无法继续。
你能告诉我如何对错误采取措施吗?

非常感谢。
Dave_Ryu。
回复:加载项管理器你好@贾斯汀_奇尔顿,我在部署到 TEST 文件夹时遇到了以下错误。 否则感谢加载项! 这应该是 JMP 中的标准功能 
错误信息:
{"argument should be character"(1, 2, "Concat", Bad Argument(currentAddinInfo["Name"]), "你没有保存你的更新信息" || /*###*/currentAddinInfo["名称"] || /*###*/"加载项。" /*###*/)}
错误:参数应该是字符
1 次。
类型:错误
函数名称:连接
错误参数:currentAddinInfo["Name"]
正在执行的函数:“您尚未保存更新的信息” || /*###*/currentAddinInfo["名称"] || /*###*/“ 加入。” /*###*/
调用堆栈:
保存按钮检查
刷新AddinTableBox
部署选定
回复:加载项管理器@贾斯汀_奇尔顿感谢您的建议。 你是对的,我想要的可以通过 include() 来处理。感谢您提供关于 <
不知道为什么我的 zip 不起作用,但我是在 Mac 上做的,在我手动尝试后所有条目都消失了。现在我得到了包含工作,无论如何都不需要手动编辑。
回复:加载项管理器@steveylin ,只需压缩加载项内容并重命名为 xxx.jmpaddin 即可,您只需确保 jmpcust 和 def 文件位于 jmaddin zip 文件的根目录。
或者,我建议将您的路径添加为“运行 thi JSL”的 include(),而不是直接使用路径使用脚本。 这将避免手动编辑 jmpcust 文件的需要。 我不确定为什么路径对您不起作用,但这是我实际用于加载项的设置。

我喜欢在插件的 Includes 中使用 <
回复:加载项管理器我是一个试图让插件工作的新手。我让它引用一个目录,但它默认为“文本”,我必须手动更改为“路径”
<动作类型> “小路” >$ADDIN_HOME(com.cirrus.pejmpscriptsMac)\pe-jmp-scripts\Check_Duplicate_Measurements.jsl
我遇到的问题是我可以修改 .jmpcust 以使其在我的计算机上运行,但我无法导出它。有没有一种简单的方法来获取 addin.def/addin.jmpcust 并自己压缩它?我希望这很简单,我不必使用加载项管理器。
我尝试使用 zip 和重命名,但没有奏效。
问候,
史蒂夫
回复:加载项管理器你好@贾斯汀_奇尔顿,我最近在部署新的 Prod 版本时遇到了这个错误。
错误信息:
{"argument should be character"(1, 2, "Concat", Bad Argument(currentAddinInfo["Name"]), "你没有保存你的更新信息" || /*###*/currentAddinInfo["名称"] || /*###*/"加载项。" /*###*/)}
错误:参数应该是字符
1 次。
类型:错误
函数名称:连接
错误参数:currentAddinInfo["Name"]
正在执行的函数:“您尚未保存更新的信息” || /*###*/currentAddinInfo["名称"] || /*###*/“ 加入。” /*###*/
调用堆栈:
保存按钮检查
刷新AddinTableBox
部署选定
回复:加载项管理器嗨内森,
是的,我确实先构建了它,并且没有收到任何错误。 但无论如何我都会收到部署消息。
约翰
回复:加载项管理器@Gido_vanderStar ,
看起来您可能使用的语言环境与我不同,这导致了未知格式错误。 我刚刚更新了插件 (v3.1),它使归档过程中使用的日期格式尊重您所在地区的日期格式。
回复:加载项管理器@john_madden您是否先单击构建按钮? 这是保存图标旁边的按钮。 这将构建插件并将其放置在开发文件夹中。
然后你可以安装DEV .... 或者,您可以部署插件的 TEST 或 PROD 版本。 (您需要先部署 TEST 或 PROD 插件,然后才能安装 TEST 或 PROD 插件。
回复:加载项管理器嗨贾斯汀,
当我尝试安装我的加载项(AIM 构建得很好)时,我收到一个错误“DEV/TEST/PROD 加载项不存在”。 我可能做错了什么?
约翰
AIM 3.0、JMP Pro EA 17.0b6、OS X 12.2.1
回复:加载项管理器你好@贾斯汀_奇尔顿,
感谢这个插件。 只是想报告一个烦恼。 安装或部署加载项时,我在日志中收到大约 50 次以下消息:
Unknown format: m/d/y h:m
在 JMP 16.0.0、Windows10 中使用最新 (v3.0) 版本的插件。
回复:加载项管理器@vohwinkelh0我收获了贾斯汀的自动更新代码,我相信,进行一些更新以允许您正在谈论的内容会很容易。
根据您的集成方式,您可以使用本地代码进行这些更新。 就目前而言,代码有一个步骤,主要是查看安装的版本是否为 PROD,然后检查是否有更新的版本。 如果安装的版本是 PROD 或 TEST,我相信您可以执行此过程......并检查部署区域元数据以查看是否有更新的 PROD 版本。
在带宽开放之前,您可能会考虑满足您的需求:)
回复:加载项管理器@pauldeen ,感谢您的报告! 它应该在 v3.0 中修复。
回复:加载项管理器@vohwinkelh0 ,对于加载项管理器中的功能来说,这听起来是个好主意。 听起来您需要某种单独的 TEST(或 beta)版本控制? 不幸的是,我目前没有足够的带宽来实现类似的东西,但我确信可以通过添加一些自定义元数据字段并在代码中使用这些字段来了解它是否是 TEST 构建。
回复:加载项管理器@贾斯汀_奇尔顿在工具提示字段中输入 & 会导致写入 addin.jmpcust 时出现故障,从而导致其不再可解析。 (JMP 16.1 Windows 10)。
回复:加载项管理器@贾斯汀_奇尔顿你知道是否有办法在 TEST 上实现自动更新功能? 我经常偶然发现我将 TEST 分发给用户以测试功能,但是一旦 PROD 更新,他们就没有部署该更新,因为 TEST 插件不会自动检查是否有新的 PROD 版本?
回复:加载项管理器谢谢@pauldeen ! 不知道 addinLoad.jsl 功能是否可用(隐藏在指南中)。 该解决方案适用于我的问题!
回复:加载项管理器@Djtjhin您可以使用包含自定义函数的 addinLoad.jsl 将空插件部署到所有计算机
或者
您可以使用您的 IT 部门来安排一个 jmpStartAdmin.jsl 文件,其中包含您描述的自定义功能这里,不需要插件。
回复:加载项管理器嘿@贾斯汀_奇尔顿,我正在尝试使用加载项管理器来部署用户定义的自定义函数,该函数理想地在启动时运行。 您能否推荐使用加载项管理器执行此操作的最佳方法?
回复:加载项管理器@贾斯汀_奇尔顿JMP17EA2 再次显示空菜单结构,日志中没有错误。 感谢这个插件,它应该直接集成到 JMP 中!
回复:加载项管理器@贾斯汀_奇尔顿@MikeD_Anderson
非常感谢您的回复! 实际上,前几天我只是偶然发现了这样做的能力,但是您击败了我将其发布在此处。
@MikeD_Anderson - 关于快速 JMP 启动的信息真的很好知道,应用程序脚本肯定开始变得非常庞大,所以这很有帮助。
我希望使用插件管理器完成的部分工作是跳过每次我想测试某些东西时必须将 .jmpappsource 导出到 .jsl 或 .jmpapp 的步骤,所以我最终得到的是下面的代码. 我不太确定它是如何工作的,但是当使用 OpenFile() 时,.jmpappsource 不会启动应用程序构建器,并且可以直接运行应用程序。 正是我需要的!
app = JMPApp();
app << OpenFile("$ADDIN_HOME(com.example.addin)\MyApp.jmpappsource");
app << Run;回复:加载项管理器@mringqui & @贾斯汀_奇尔顿- 只是对贾斯汀提到的方法的一点色彩评论。 您需要先将 jmp app 源文件编译成 .jmpapp 文件。 当您在应用程序构建器中时,这可以在文件 > 导出下完成。 然后将 .jmpapp 文件包含在加载项包中并打开 .jmpapp 文件:
open("$ADDIN_HOME(com.example.me.myaddin)/MyApp.jmpapp");
这就是 JMP 默认插件向导的样子。

请注意,与直接嵌入 JSL 相比,这具有一些很好的连锁效应。 最大的是,对于非常大的应用程序,它将阻止 JMP 在启动时变慢。 所有的代码都需要在启动时进行解析——所以如果你的脚本真的很大或者你有很多,它可能会减慢速度——这是我在使用 STK 时遇到的问题。 作为应用程序嵌入意味着 JMP 只需在启动时解析一行代码。 还有其他一些,但这是 IMO 中最重要的一个。
回复:加载项管理器@mringqui , 感谢您与我们联系。 我在想这需要对加载项管理器加载项进行一些更改,但是@MikeD_Anderson向我展示了如何使用加载项管理器已经工作的方式来做到这一点。
不要设置要运行的文件,而是使用运行 JMP 应用程序源文件的脚本。 您只需将其粘贴到“运行此 JSL”的文本框中。
Include("$ADDIN_HOME(com.example.me.myaddin)/MyApp.jmpappsource");</CODE></PRE></LINGO-BODY><LINGO-SUB id="lingo-sub-394777" slang="en-US">回复:加载项管理器</LINGO-SUB><LINGO-BODY id="lingo-body-394777" slang="en-US"><P>嗨,伟大的工作! 我希望创建一个使用 .jmpappsource 文件作为菜单项的“在此文件中运行 JSL”操作的加载项。 这是可以轻松添加的东西吗? 现在,被迫使用 .jsl 文件限制了我以方便的方式使用加载项管理器的能力。 谢谢!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-386516" slang="en-US">回复:加载项管理器</LINGO-SUB><LINGO-BODY id="lingo-body-386516" slang="en-US"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/1855" target="_blank">@贾斯汀_奇尔顿</A><BR />我使用 $ADDIN_HOME 和 Get Default Directory() 的组合,具体取决于我需要在哪里/如何包含东西。 对于我的许多包含,我确实有一组库,这些库对于我的许多工具都是通用的,并且我确实将它们完全视为一个单独的插件。 然后,我制作的任何工具都只包含 $ADDIN_HOME 中的文件,并且所有库函数都可供我或任何可能想要使用它们的人使用。<BR /><BR />我不确定为什么<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/2173" target="_blank">@tsl</A>必须将额外的层添加到 zip 中。 从我的角度来看,将它留在他的第一个层次结构中的组织会使事情总体上更简单,但不了解该基础架构的所有细节,我可能会遗漏一些东西。<BR />通常,一旦设置了原始内容,我需要对 .jmpcust 文件进行的唯一更新是更新版本更新的显示名称(我在我的存储库中执行此操作,但可以在插件管理器中完成)。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-386499" slang="en-US">回复:加载项管理器</LINGO-SUB><LINGO-BODY id="lingo-body-386499" slang="en-US"><P>感谢您的澄清<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/2173" target="_blank">@tsl</A> . 在我看来,它可以对您的流程进行一些更改。</P>
<OL>
<LI>不要更改 $ADDIN_HOME 文件夹,而是使用相对路径和 Get Default Directory()。 这也使得开发插件更容易,因为任何对它的引用都是针对已安装版本的。</LI>
<LI>使用变量来确定 CommonFiles 的相对路径位置并在您的包含中使用它,因为位置在生产加载项和开发存储库之间有所不同。</LI>
</OL>
<P>或者,您可以放弃将 CommonFiles 复制到每个加载项中的想法。 您可以为 CommonFiles 创建一个单独的加载项条目(它没有命令项),并要求用户在加载项之外安装它。 这意味着用户只有一个 CommonFiles 副本(这可能是好事也可能是坏事,具体取决于您在更新 CommonFiles 后测试所有加载项的频率。 有了这个,您可以使用 $Addin_Home 路径变量包含文件,但您仍然需要弄清楚如何从开发中包含它们。 这可能类似于<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/6649" target="_blank">@内森克拉克</A>正在做,但我不确定。</P>
<P>另一种选择是,我可以实现一个您可以定义的非常灵活的后处理脚本,而不是我为您实现副本(有些限制)。 比如说,您定义了一个引用 ZipArchive 的函数,并且您可以按照您认为合适的方式操作它。 此解决方案可能需要您和我进行最少的更改。</P>
<P>很抱歉所有的漫无边际,但希望这些建议之一能让我们朝着正确的方向前进!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-386453" slang="en-US">回复:加载项管理器</LINGO-SUB><LINGO-BODY id="lingo-body-386453" slang="en-US"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/1855" target="_blank">@贾斯汀_奇尔顿</A>,是的,您所描述的事情与我所做的非常接近。 让我详细说明一下,如果我使用插件管理器会发生什么。 (而且我仍在探索和学习它是如何工作的,所以如果我错过了代表它可以做什么,请原谅我!)</P><P> </P><P>构建插件后,我将源文件夹设置为 Addin_1\Source,我在 Addin_1\Release 文件夹中有一个名为 Addin_1.jmaddin 的文件。</P><P>我将其重命名为 .zip 扩展名,打开并查看。 我发现它看起来像这样:</P><P> </P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Addin_Initial_Folder_Structure.png" style="width: 217px;"><span class="lia-inline-image-display-wrapper" image-alt="Addin_Initial_Folder_Structure.png" style="width: 217px;"><img src="https://us.v-cdn.net/6038925/uploads/images/32932i1AD28B843A933FC3/Addin_Initial_Folder_Structure.png" role="button" title="Addin_Initial_Folder_Structure.png" alt="Addin_Initial_Folder_Structure.png" /></span></SPAN></P><P> </P><P>(还有几个 XML 文件我用来管理一些事情,但为了简单起见,我们可以跳过这些文件)</P><P>然后,我通过在 .zip 中创建一个新文件夹并将所有 Source_1 等文件拖到该新子文件夹中来手动更改 zip。 我将 addin.jmpcust 和 add.def 保留在根级别,否则加载项将无法安装。 我还将 CustomMetaData.jsl 保留在根级别,因为我猜这就是它需要的地方。</P><P>然后我将我还需要的 CommonFiles 文件夹拖到 .zip 中。 我最终的 Zip 结构如下所示:</P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Addin_Final_Folder_Structure.png" style="width: 220px;"><span class="lia-inline-image-display-wrapper" image-alt="Addin_Final_Folder_Structure.png" style="width: 220px;"><img src="https://us.v-cdn.net/6038925/uploads/images/32933i3C14631B2CA97BE7/Addin_Final_Folder_Structure.png" role="button" title="Addin_Final_Folder_Structure.png" alt="Addin_Final_Folder_Structure.png" /></span></SPAN></P><P>然后我还有一件事要做:现在需要编辑 .jmpcust 文件中的 <ACTION type=""path""> 行。 而它说</ACTION></P><P>$ADDIN_HOME(com.xyz)\Source_1\Code_1.jsl</P><P>我需要将其更改为阅读</P><P>$ADDIN_HOME(com.xyz)\Addin_1\Source_1\Code_1.jsl</P><P>我可以在文本编辑器中使用搜索/替换来完成。</P><P>完成所有这些步骤后,我就可以部署和安装插件,一切正常。</P><P> </P><P>对于您的最后一条评论,因为这个插件是一套工具,每个插件在 Addin_1 中都有自己的“源”子文件夹,所以为了引用 CommonFiles,我在 Code_1.jsl 等中的 Include() 语句确实有一个额外的"..\" 上一级以正确找到包含文件。</P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-385991" slang="en-US">回复:加载项管理器</LINGO-SUB><LINGO-BODY id="lingo-body-385991" slang="en-US"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/2173" target="_blank">@tsl</A><BR />我对颠覆做了类似的事情,我使用插件管理器发布任何 Repo 活动。 提交所有代码后,我将导出到成为插件“源”的位置(本地或网络文件夹)。 就个人而言,我在我的存储库中管理我的 .jmpcust 文件和 .def 文件,因此它们也可以导出,但是您可以只导出代码并使用 Addin Manager 制作 .def 和 .jmpcust 文件(它将在源文件夹中创建文件,在我的情况下,从 repo 中导出新内容只会覆盖正在导出的文件)。<BR /><BR />然后我使用他的工具来处理所有的打包、归档和分发到我的生产文件夹(无论如何,这总是花费最多时间手动完成)。 为了让我自己更轻松,因为我也有许多插件在插件管理器之前被管理,我还手动编辑了 jmp 文件,其中存储了所有信息(插件、名称、源文件夹等),所以我准备好了所有插件当我启动插件而不是通过该界面手动添加它们时去)。</P><P> </P><P>除了插件本身之外,我还更新了一些功能,以允许我的用户在新版本投入生产时收到通知并自动更新插件。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-385979" slang="en-US">回复:加载项管理器</LINGO-SUB><LINGO-BODY id="lingo-body-385979" slang="en-US"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/2173" target="_blank">@tsl</A> ,当您手动压缩时,加载项的文件结构是什么样的?</P>
<P>我想,因为您的代码包含到 CommonFiles 目录的相对路径,所以您的加载项看起来像这样?<SPAN style="font-family: inherit;">插件文件中不包含Release文件夹吗?</SPAN></P>
<P> </P>
<PRE>Addin_1.jmpaddin
|_Addin
|_Source<BR /> |_Code.jsl<BR /> |_Release<BR /> |_Something?<BR /> |_CommonFiles</PRE>
<P>在上述结构中,“Addin”文件夹的存在只是为了保持文件夹结构与您的相对路径相同。 你是这种情况吗?</P>
<P>我想我可以添加一个新的可选目录路径,它可以作为构建过程的一部分复制到加载项文件中。 但是,我们仍然需要解决目录问题。 为了解决这个问题,我的想法是添加一个小片段来设置 CommonFiles 目录的位置,并将其用于所有常见文件包括。 或者,您可以创建一个“IncludeCommonFile()”函数,尝试从生产位置包含并故障转移到开发位置</P>
<P> </P>
<PRE><CODE class=" language-jsl">commonFilesDir = Directory Exists("../CommonFiles/",
"../CommonFiles/", // production location
"../../CommonFiles/" // development location
);
//or
IncludeCommonFile = Function({file},
Try(Include("../CommonFiles/" || file), Include("../../CommonFiles/" || file));
);
这将为您提供以下结构,如果我要添加共享文件夹功能,我*认为*会起作用。 我能想到的一个小问题是,如果您在 Source 中有其他文件夹,那么 Include 函数将不起作用,或者您需要使用 directory 变量在您的包含中添加额外的“../”。
Addin_1.jmpaddin
|_Source
|_Code.jsl
|_CommonFiles
回复:加载项管理器你好@贾斯汀_奇尔顿,
我刚刚发现了您的加载项管理器并且很感兴趣。 多年来,我一直在手动管理加载项,包括手动编辑 .jmpcust 文件。 我看到了使用您的插件管理器让我的生活更轻松的机会。 但是,我想知道如何让它支持我想做的事情。
我将参考建议的文件夹结构的附图。 想法是有一个包含 JMP 代码的文件夹,我们在这里将其称为 RepositoryRoot。 此文件夹位于 GIT 实验室存储库中,并在两个或多个 JSL 开发人员之间共享和同步。
每个开发人员在存储库中都拥有一个插件。 我们称它们为 Addin_1 和 Addin_2。 这些加载项位于存储库中各自的子文件夹中。
在存储库中还有一个我们将称为 CommonFiles 的文件夹,其中包含两个插件都使用的一些标准 JSL 库文件。
这些标准库文件包含在各个加载项中,例如 Addin_1\Source 中的 JSL 文件可能有如下行
包括(“..\..\CommonFiles\LibraryFile1.jsl”);

所以问题是我们如何通过 Add-in Manager 来利用这个结构? 我遇到了两个可能的选项的问题:
1) 如果在加载项管理器中我让“RepositoryRoot”作为源文件夹,那么它会在 RepositoryRoot 中创建 Addin.def 和 Addin.jmpcust。 这不起作用,因为我们在给定的源文件夹中只能有一个 addin.def,并且我们希望与不同的开发人员拥有单独的加载项,但共享代码。
2) 如果我让“RespositoryRoot\Addin_1\Source”作为源文件夹,那么 addin.def 和 addin.jmpcust 会在 Addin_1 的子文件夹的 Source 文件夹中创建。 这很好,因为它包含在自己的文件夹中。 但是,我看不到任何将 CommonFiles 文件夹从目录树中的两个级别添加到加载项的方法。 该代码需要该公共文件夹,但我们希望将其保持在更高级别以进行代码共享和同步。
我知道,在发布插件之前,最终“CommonFiles”文件夹确实必须复制到每个最终的 .jmpaddin 文件中。
希望我们能找到一个插件管理器功能来为我们管理它。 我们的替代方法是手动创建 .zip 文件并按照我们需要的方式设置文件夹结构,然后在发布之前将扩展名更改为 .jmaddin。
如果您有想法或考虑让加载项管理器支持此功能,那就太好了。
非常感谢
汤姆
回复:加载项管理器感谢你的回复@贾斯汀_奇尔顿! 我最终为 jmp 实施了一个浅色主题,以完全避免颜色问题。 我会尝试你的建议,点击退出键来解决延迟时间。
回复:加载项管理器你好@alavy ,
我不确定响应时间慢是怎么回事。 我将不得不做一些进一步的调查,看看是我的插件有问题还是 JMP 有问题。 但是,我确实找到了一个不错的解决方法。 第一次单击文本编辑框时,按住退出键直到文本不再处于焦点。 现在,所有编辑框在您单击它们后都应该可以正常工作了。
至于配色方案,我不确定是什么原因造成的。 2.5 之后的任何版本的加载项都应该具有适合深色主题的颜色。 我认为重现该问题的唯一方法是在 JMP 打开时从浅色主题切换到深色主题。 我总是得到灰色主题的下面的视图。

回复:加载项管理器嘿@贾斯汀_奇尔顿,
我在 MacOS 上运行的 JMP 15.1 上使用 v2.9 插件。 每当我需要在插件的任何文本框中输入文本时,都会遇到非常慢的响应时间。 这太慢了,以至于使加载项无法使用。
第二个较小的问题是,所有配色方案都不适用于在暗模式下设置的 JMP。 文本框中的文本颜色太浅,无法根据背景颜色阅读。

回复:加载项管理器@贾斯汀_奇尔顿我相信我确实具有写入权限,因为我可以看到旧插件已正确存档并且新插件已更新,但我仍然看到错误。 我不确定具体是哪一步失败了。 关于已安装的网络驱动器,不幸的是,我可能对此不太了解。 我不确定这个状态,但也许我可以询问周围的同事以了解更多信息。
回复:加载项管理器@Djtjhin ,听起来很可能与它是共享点位置有关。 您能否通过在文件资源管理器中创建文件来确认您对该位置具有写入权限? 即使您有权限,JMP 也可能没有作为应用程序的权限。 您是使用常规网络路径还是通过已安装的网络驱动器保存? 将 sharepoint 服务器挂载为网络驱动器可以解决权限问题,因为 JMP 可以只保存到挂载的驱动器。 对于常规网络路径,可能需要凭据,这是 JMP 不支持的。
回复:加载项管理器感谢您澄清贾斯汀!
跟进问题,我在尝试部署到生产环境时收到以下错误消息。 目标文件夹实际上是一个共享点。 我不确定这是否是原因,或者是否有解决方法。
错误信息:
{“文件未在写入模式下打开。 "(1, {1}, 2, "保存文本文件", 保存文本文件 /*###*/(filepath, str))}
错误:文件未在写入模式下打开。
1 次。
数据表索引:1
类型:错误
函数名称:保存文本文件
正在执行的函数:保存文本文件 /*###*/(filepath, str)
调用堆栈:
部署选定
回复:加载项管理器@Djtjhin ,
我建议将语句放在每个命令中,以便在使用插件时进行检查,而不是每次用户启动 JMP 时进行检查。 此外,在启动时更新加载项存在问题,因此当用户单击加载项命令时这样做是一种更安全的方法。
回复:加载项管理器@贾斯汀_奇尔顿我可以澄清一下您之前提供给 Sebastien 的回复吗? 那么,如果我将自动更新语句(如下)放在“启动脚本”(快照)中,它会起作用吗? 或者我们应该只在每个命令脚本下包含自动更新语句?
Include( "$ADDIN_HOME(com.jmp.myaddin)\updateCheck.jsl" );
com.jmp.juchil.addinmanager:checkForUpdate();

谢谢
丹尼尔
回复:加载项管理器已确认,再次生效,谢谢!
回复:加载项管理器谢谢@pauldeen .我认为有几个不同的因素相互冲突。 一方面,该错误应该在最终的 JMP 16.0 版本中得到解决,但在 EA8 中存在。 此外,这个错误可能是因为您的语言环境不支持我使用的日期格式。 为了解决这个问题,并且对区域设置更加友好,我更新了一些我格式化日期的地方,以使用区域设置日期时间而不是特定格式。 这应该可以修复错误并以更友好的格式放置日期。
回复:加载项管理器感谢对文件夹的 2.8 修复!
我有一个新的给你:
打开加载项管理器,选择一个加载项:

运行 JMP 16EA8。
在 Windows 10 下的 JMP 15.2.0 上同样的事情没问题
回复:加载项管理器@贾斯汀_奇尔顿谢谢! 我会试试的。
回复:加载项管理器@pauldeen ,我刚刚上传了一个新版本 (v2.8),它修复了您看到的子文件夹问题。 我还添加了一个复选框选项来自动为您创建一个文件夹,就像您最初期望的那样。
回复:加载项管理器@Sburel , 您可以将该代码添加到您想要检查更新的任何位置,例如在菜单项命令的开头。 这可以使当用户单击命令时,它会在启动加载项之前检查新版本。
如果我没记错的话,在 addinLoad.jsl 文件中使用此代码存在问题,这将导致它在 JMP 启动时进行检查,但是在加载项时重新安装加载项存在问题仍在加载中。 这个问题可能仍然是问题,也可能不是问题。
-贾斯汀
回复:加载项管理器@贾斯汀_奇尔顿
真的很酷的插件。 工作得很好。但是,我一直在努力使用自动更新功能。 特别是,我对添加以下代码片段的适当文件/位置感到困惑
Include( "$ADDIN_HOME(com.jmp.myaddin)\updateCheck.jsl" );
com.jmp.juchil.addinmanager:checkForUpdate();
最好的
塞巴斯蒂安
回复:加载项管理器@贾斯汀_奇尔顿啊,是的,创建一个空文件夹会让你通过这个屏幕。 文件夹的名称似乎并不重要,只有它是空的这一事实。
在测试中,我发现了另一个错误:
如果我使用您的加载项管理器 v2.7.jmpaddin 并创建空文件夹,然后像这样加载它,我会通过添加屏幕但出现一个大错误:其他包含子文件夹的加载项也会发生同样的情况.

回复:加载项管理器@pauldeen源文件夹也是 jmpaddin 文件将被解压缩的地方(我可能应该让它自动创建文件夹,但我想我没有)。 我建议在“Desktop”文件夹中创建一个名为“ASM Training Material”的文件夹并将其设置为源文件夹。 源文件夹中不能有任何内容,因为它最终都会压缩在加载项中。
回复:加载项管理器@贾斯汀_奇尔顿从现有的 .jmpaddin 文件添加加载项时,我们在此屏幕上有一个错误:

您不能将源文件夹留空,如果您将任何内容放在那里,您会收到警告,从 jmpaddin 文件开始时它需要为空。
回复:加载项管理器奇迹般有效。 谢谢海宁
回复:加载项管理器你好@vohwinkelh0 ,
感谢您报告此事。 几天前我看到了这个错误,你的评论提醒了我,所以我终于能够用其中一个文件/目录函数将问题追溯到一个错误。
我已更新此页面上的加载项以暂时解决此问题,但我也在 JMP 中指出了该问题,以便我们可以在 JMP 16 发布之前解决它。
谢谢,
贾斯汀
回复:加载项管理器贾斯汀,
作为 JMP16EA 程序的一部分,您的加载项出现错误。 你想让我在那里提交错误报告还是我应该在这里发布?
亨宁
回复:加载项管理器非常感谢分享……下周试试。
回复:加载项管理器@guillaumebugnon所以我在for循环中使用这个函数来加密脚本。
encryptScript = Function({filepath},
{defaultLocal},
errortxt = "";
winCount = N Items (Window ());
scriptWin = Open (filePath);
scriptWin << Bring Window to Front;
Wait (1);
Main Menu ("Encrypt Script");
windowList = Window ();
encryptedWin = windowList[nitems(windowList)]; // get reference to encrypted script window (i.e. the last window)
//TODO: Implement without Try
Try (
encryptedScript = encryptedWin[Script Box(1)] << Get Text;
save text file(filePath, encryptedScript);
ConsoleMsg("File Encrypted: "||filepath); // hoping this goes to stdout
,
errortxt ||= char(exception_msg) || "\!r\!n";
);
Try (scriptWin << Close WIndow());
Try (encryptedWin << Close WIndow());
Return (errortxt)
);
然后我还有一个自动脚本通过并输入密码并按回车键。
这绝对不是一个完美的解决方案,您的愿望清单项目会更好。
回复:加载项管理器@pauldeen ,
感谢您报告自定义菜单加载项的问题。 我刚刚上传了一个可以解决这个问题的新版本。
-贾斯汀
回复:加载项管理器@贾斯汀_奇尔顿感谢您的回答。
拥有一个可以加密其他 jsl 文件(或其他方式)的 jsl capabale 函数可能会很有用。
我看了@vince_faller今天上午(法国时间)的演讲。 好东西。
我们也有一些 Devops 流程,但需要更多的自动化。
纪尧姆
回复:加载项管理器
@guillaumebugnon ,
@vince_faller可能有一些关于加密脚本的提示。 但是,我需要向加载项管理器添加一项功能,以便能够在压缩过程之前修改要添加的文件。
我认为@vince_faller昨天还做了一个演示/网络广播,可能对你有用: https://www.brighttalk.com/webcast/18305/412912
- 贾斯汀
回复:加载项管理器大家好,
在将脚本压缩到 jmpaddin 文件之前,是否有人有加密脚本的提示或经验?
谢谢
问候,
纪尧姆
回复:加载项管理器
在 JMP15 Windows 10 上运行,插件管理器无法再从现有插件解析菜单结构。
重现:创建一个新插件并使用自定义重命名顶级菜单。 创建命令并保存插件定义。
关闭插件管理器,重新打开并尝试查看刚刚创建的插件的菜单项选项卡(确保在查看任何其他插件菜单结构之前先查看此选项卡)。
要使其正常工作,请创建第二个加载项,您不要更改顶部菜单项,而是将其保留为默认的“加载项”。 保存此插件。 关闭加载项管理器,再次打开,先查看默认顶层名称的菜单结构,然后再查看自定义的菜单结构。 这一切都再次起作用。
回复:加载项管理器#2 从 JMP15/OSX15 开始,但我还没有尝试过 2.4,我会回复你。
回复:加载项管理器谢谢,贾斯汀!!
回复:加载项管理器你好@john_madden ,
感谢您与我们联系并为延误道歉。
#1 应该在我刚刚上传到这里的 v2.4 中解决。
对于 #2,我无法在 Windows 上复制此问题,但我将在 Mac 上进一步调查。 您是否碰巧知道此问题是从特定的 JMP 版本号(即 JMP 14/15)还是从 macOS 版本(10.14/15)开始的,还是一直发生在您身上?
谢谢,
贾斯汀
回复:加载项管理器嗨贾斯汀,
我在 JMP 15/Mac OS 10.15 下的加载项管理器有几个问题。
(1)【trivial】最大/最小JMP版本选项需要包含15个
(2) [不那么琐碎] 在管理器内的多个窗格中的文本框中输入文本似乎(部分)损坏了。 我可以通过粘贴输入文本(例如加载项名称、版本等),但不能通过键入。
谢谢。
约翰·马登
回复:加载项管理器您好,在手动管理更改多年后,我开始使用加载项管理器。 但是,我最近遇到了菜单项不可见的问题,我最近更新到 JMP 14.3.0,不确定这是否相关。 我以前对此没有任何问题。
如您所见,标记的构建或部署中没有错误,因此我对正在发生的事情感到茫然。
感谢任何帮助或建议,因为我真的不想从头开始重建它。
问候,
德里克。

回复:加载项管理器嗨亚当,
对延迟回复表示歉意。 根据您在删除尝试时看到的错误消息,我认为 updateCheck 脚本能够找到 customMetadata 文件的假设是正确的。 我知道你在哪里有'
aa = 包括( “$ADDIN_HOME(com.jmpTest.myjmpaddin)\customMetadata.jsl” ) ;'脚本的一部分。 但是,您实际上并不需要在其中包含该文件。 相反,您想更改 updateCheck.jsl 脚本中的包含。 它应该如下所示(在第 11 行附近)。
customMetadata_aa = Include( "<SPAN>$ADDIN_HOME(com.jmpTest.myjmpaddin)\</SPAN>customMetadata.jsl" );
如果您有任何其他问题,请告诉我。
问候,
贾斯汀
回复:加载项管理器你好贾斯汀,
由于这是我的第一个加载项,而且我在 JMP 体验方面还是个婴儿(大约 11 个月的使用时间),我现在可能会在激活更新检查功能时开始问一些简单的问题。我创建了一个简单的测试插件,只关注更新功能,这样我就可以在将它应用到我更健壮的程序之前理解这个功能。
剧本:
aa = Include( "$ADDIN_HOME(com.jmpTest.myjmpaddin)\customMetadata.jsl" );
Include( "$ADDIN_HOME(com.jmpTest.myjmpaddin)\updateCheck.jsl" );
com.jmp.juchil.addinmanager:checkForUpdate();
New Window ("Test 3",
Panel Box ("Test 3",
Text Box("Test 3")
)
);
回答您的问题:
- 我是否设置了“创建元数据文件”首选项?
- 我确实为“创建元数据文件”选中了复选框,但我的脚本中没有包含包含语句的自定义元数据代码。如上所示,我已将这行代码添加到更新检查代码之前的行中,但它并没有解决问题。
- 我的插件的目录结构是什么?
- 在 Add-In Manager 窗口的中间部分,在 Files 选项卡下,addin.def、addin.jmpcust、customMetadata.jsl 和 updateCheck.jsl 都存在于同一个文件夹中。该文件夹与插件文件本身 (.jmaddin) 位于同一父文件夹中。
- 此文件夹存在于我的 C 盘上,而不是服务器上。我应该也将这些文件保存到服务器吗?
- 在底部的 Prod 选项卡中,我将所有三个选项都保存到服务器位置。他们每个人都有自己的文件夹,并且所有三个文件夹都存在于同一个父文件夹中。
- ARCHIVE - 仅包含我部署时加载项的先前迭代。
- META – 仅包含文件 publishedAddins.jsl
- PROD – 仅包含加载项安装程序文件 .jmaddin
- 注释掉“Try()”时收到什么错误消息
- 我收到错误消息“文件错误:路径无效:\customMetadata.jsl”
- 我尝试将上述位置路径从 $ADDIN_HOME... 语言更改为我的 C 驱动器上的确切位置,因为它在文件选项卡(中间部分)中被调用。它没有帮助,我收到了同样的错误信息。
谢谢您的帮助!
-亚当
回复:加载项管理器你好@Adam_R ,
感谢您在细节方面所做的所有工作! 几个问题和要尝试的事情:
- 您是否在“自定义元数据”首选项组下设置了“创建元数据文件”首选项? 此文件是更新脚本通过所必需的。
- 您的插件的目录结构是什么样的? 脚本是否在较低级别的文件夹中调用“com.jmp.juchil.addinmanager:checkForUpdate”? 如果是这样,updateCheck.jsl 文件期望它位于从中调用该文件夹的同一文件夹中,从而使该函数不起作用。 解决方法是在插件的根级别添加另一个 JSL 文件(与 customMetadata.jsl 和 updateCheck.jsl 相同),该文件调用 updateCheck 函数并将该文件包含在较低级别的 JSL 脚本中。 另一种选择是编辑 updateCheck.jsl 脚本以使用 '$addin_home(com.jmp.myaddin)/customMetadata.jsl' 而不仅仅是相对文件名。 如果这是问题所在,我可以更新插件以使其更加灵活,而不那么依赖于调用函数的默认目录。
- 实现了 updateCheck.jsl 脚本,因此它使用 Try() 静默失败,以免干扰加载项的工作流程。 所以,如果前两个建议都没有解决它,您能否注释掉 updateCheck.jsl 文件中的 Try() 并让我知道您在尝试检查更新时收到什么错误消息?
如果您有任何问题,请告诉我。
问候,
贾斯汀
回复:加载项管理器你好贾斯汀,
加载项管理器 v2.3 对我来说在各个方面都运行良好,但其中之一是,我无法让 updateCheck 正确推送更新。一些事实:
- 我在更新检查之外的代码运行正确。
- 我的 PROD 文件夹“元数据”和“部署”都位于同一父文件夹下的服务器位置,并且我已验证用户可以访问它们。
- 在首选项部分中,我选择了“包含更新检查脚本”,并将本部分中提供的包含语句复制到我的代码中。我已从 (com.jmp.myaddin) 编辑此语句的加载项 ID 部分以匹配我的加载项。我没有在此语句中编辑任何其他内容,也没有在 updateCheck.jsl 脚本中编辑任何内容。
- 对加载项进行更改并部署到 PROD 时,我已验证元数据服务器文件中的 publishedAddins.jsl 文件中的“pubDate”已随每次部署而更改
- 我让用户下载了位于 PROD 文件夹中的文件的现有版本,关闭 JMP,重新打开 JMP,并成功运行加载项。
- 我已将更新的迭代部署到 PROD,验证 pubDate 已更改,并请求之前的用户重新打开 JMP 并运行现有的加载项。永远不会提示用户更新加载项。
- 我让同一个用户进入 PROD 文件夹并重新安装加载项,它已成功更新加载项。
回复:加载项管理器嗨奥布里,
updateCheck.jsl 脚本中的 Include 语句使用 customMetadata.jsl 文件的相对路径。 只要这两个文件都在同一个文件夹中,它应该可以正常工作。 您的加载项的文件夹结构是什么样的?
如果您需要在此公开帖子上发送您不想要的任何内容,请随时给我发送私信。
谢谢,
贾斯汀
回复:加载项管理器贾斯汀,
我遇到了自动更新功能的问题。我已将问题追溯到 updateCheck.jsl 脚本。
以下行失败,然后 try 语句退出。
customMetadata_aa = Include("customMetadata.jsl" );
如果我将以下内容添加到文件路径中,则没有问题,并且看起来事情像宣传的那样工作。
$ADDIN_HOME(my_addin_here)
我应该为每个插件都这样做还是应该是自动的?
谢谢,
奥布里
回复:加载项管理器贾斯汀,
2.3 版在我的 Mac 上就像一个魅力!谢谢!!!
约翰
回复:加载项管理器@贾斯汀_奇尔顿谢谢! 我会试试看。
回复:加载项管理器@john_madden ,
感谢您报告此事! 看起来您使用的是 Mac,并且您必须重命名或删除了您的源文件夹之一。 我现在添加了一个检查(v2.3)所以它不应该再失败了。
回复:加载项管理器@内森克拉克,
如果您仍有 1.3 版的加载项,您可以更改该版本的 ID 和菜单项名称,并将其与新版本一起使用。 版本 1 允许您使用复选框一次构建多个,并且应该能够与版本 2 使用的数据表挂钩。 v2.0 中有很多架构更改,所以不幸的是我不得不删除复选框。 我把它放在我的清单上,以便将来添加。
回复:加载项管理器嗨贾斯汀,
在 JMP 14.0.1 中,我不断收到此错误:
错误消息:{"argument should be list"(1, 2, "Concat Items", Concat Items /*###*/(errorList, " "))} 错误:参数应该是 list 1 次。 类型:错误函数名称:Concat Items 正在执行的函数:Concat Items /*###*/(errorList, " ") 调用堆栈:getLastModifiedDateOfNewestFile getStatusIcon refreshAddinTableBox initialize
有任何想法吗? 这是经理 2.2。
约翰
回复:加载项管理器@贾斯汀_奇尔顿
再次感谢这个插件。 我终于跟上了新版本的速度,并利用了你对我手动操作的一些改进:)我的一个问题是,我不确定这是否可能,是能够一次构建多个插件。 我知道信息和目录的底部面板是特定于插件的,但如果选择了多个插件,这些面板可能会消失。 然后所有选择的都可以是 DEVd/Deployed/etc。
我现在管理 40 多个插件,而且我经常批量更新,所以能够一次完成一堆所有插件会很棒!
回复:加载项管理器这次真是万分感谢! 现在创建和更新插件非常容易,以至于我开发和改进自己的插件比使用这个工具之前的黑暗时代更频繁。
回复:加载项管理器我想变得如此优秀和慈善,并感谢 JMP 开发人员提供了我喜欢教授的软件程序的第 13 版。 我从 5.0 版开始就拥有了它,它有很好的纸质手册,老实说,自从那个版本以来,没有任何东西对我有任何价值。 但是像我一样喜欢 5.0 版本,我每年都开心且心甘情愿地升级。 然后ROC-Curve & 部分曲线下面积分析出现了在 JMP12 中很漂亮的脚本。 我已经设置了一个教学课程来向我的学生展示 ROC 曲线……我升级到 v13……现在它不显示曲线了。嘘。
回复:加载项管理器你好@tejvishnu ,
是的,安装此插件需要 JMP 13。 不幸的是,我无法使这个插件与 JMP 12 兼容。 我已更新帖子以包含此信息。
谢谢,
贾斯汀
回复:加载项管理器我的插件似乎没有安装计算机。 这似乎是一些最近上传的加载项的问题。 此插件是否需要 JMP-13?
我的电脑上有 JMP 12.2。