自动完成和代码建议¶
注意
目前,这是一个实验性项目。如果您选择设置和使用PySpigot的这部分,请预计会有错误和频繁更改。我会在Discord上通知任何更新和变更,所以如果您还没有加入,请务必加入以保持最新动态。
如果您正在寻找如何为自己设置此功能的指导,请直接跳转到设置部分。
在编写PySpigot脚本时,您可能会遇到一个困难,即在您编写脚本时,IDE中缺乏代码建议和自动完成功能。之所以在编写脚本时这些功能不可用的原因相对直接 - 因为PySpigot脚本是在运行时执行的,IDE/文本编辑器完全不知道您在编写脚本时引用的函数、类等是什么。
编写更复杂的脚本可能很快变得繁琐,因为API中没有任何内容可用,所以您需要手动查找一切,包括包、类名、函数和API文档。这个项目旨在在编写脚本时消除这些困难。
概述¶
该项目的核心是docs-translator,这是一个Java程序,简单来说,它接受有文档记录的Java源代码,将其翻译为带文档记录的Python代码,然后将翻译后的源代码捆绑到一个可安装的Python包中。然后可以将这些Python包安装到一个虚拟环境中,供IDE使用。
docs-translator的工作原理¶
docs-translator 严重依赖于JavaParser库,简单来说,该库可以读取Java源文件(.java),然后将其转换为抽象语法树,这样就可以通过程序进行读取并相对容易地将其转换为Python源文件。
该应用程序通过以下步骤运行:
- 应用程序初始化所有工作目录。
- 从远程存储库/URL下载Java源文件JAR(即格式为
*-sources.jar的文件)。 - 应用程序循环遍历下载的源文件JAR中包含的所有文件。当遇到Java源文件(以
.java结尾)时,使用JavaParser解析文件,并尽力将源文件翻译为Python代码。- 忽略任何不以
.java结尾的文件。
- 忽略任何不以
- 翻译后的
.py文件被放置在用户定义的输出文件夹(默认为generated)中,放置在适当的包中。 - 在适当的包中的
__init__.py文件中添加条目,以允许按照在Jython中导入Java类的方式导入Python模块。 - 之前转换的Java源文件中使用的Java标准库的任何源文件也会按照上述相同的过程进行翻译。
- 所有
__init__.py文件都将生成并放置在适当的位置。 - 基于
settings.yml文件中指定的选项生成Python包相关的文件(setup.py、pyproject.toml、MANIFEST.in、LICENSE),并将其放置在用户定义的输出文件夹中(默认为generated)。
我接着使用 python -m build 命令构建生成的 Python 包,并使用 twine 将其上传到 PyPI。目前,这个步骤是手动的,但我正在考虑扩展 docs-translator 的功能,以便自动化完成这一步骤。
设置¶
设置相对简单,包括创建一个新的 Python 虚拟环境,在其中使用 pip 安装来自 PyPI 的必要包,然后将虚拟环境指定为您选择的 IDE 中的 Python 安装位置。
虽然这应该适用于任何 IDE,但此示例使用Visual Studio Code (VS Code),因为这个 IDE 非常受欢迎、免费、功能丰富,并且是我在编写 Python 代码时使用的IDE。我也没有测试这在其他IDE中的兼容性。
先决条件¶
- 确保您的系统上已安装 Python 3,并且正在运行 Python 3.6 或更高版本。尽管 PySpigot 只支持 Python 2,但此项目需要 Python 3。您可以通过运行以下命令来检查:
1python --version - 您选择的 IDE。本指南偏爱使用 VS Code。
- 一个用于放置脚本和项目的项目目录。这可以是
PySpigot插件文件夹,或者如果您希望将开发环境与服务器分开(或者服务器位于另一台计算机上),则可以是一个单独的目录。- 这也是放置 Python 虚拟环境的首选位置。
创建 Python 虚拟环境¶
Note
虽然在设置这个过程中不是严格要求的,但强烈建议创建一个虚拟环境,因为包含翻译后的 Java 源代码的 Python 包可能以不可预测的方式干扰其他本地 Python 包。使用虚拟环境可以确保翻译后的源代码与全局安装的本地 Python 包保持隔离。
- 打开 命令提示符(cmd) 或者 PowerShell。
- 切换到您的项目目录:
1cd 项目目录的路径 - 使用 Python 创建一个虚拟环境:
1python -m venv venv- 注意,在上述命令中,最后一个参数是虚拟环境的名称。在这种情况下,我们将其命名为
venv。
- 注意,在上述命令中,最后一个参数是虚拟环境的名称。在这种情况下,我们将其命名为
- 激活虚拟环境:
- 命令提示符:
1venv\Scripts\activate - PowerShell:
(注意:如果使用 PowerShell,您可能需要使用
1venv\Scripts\activate.ps1Set-ExecutionPolicy Unrestricted -Scope Process命令来启用脚本执行权限)
- 命令提示符:
- 虚拟环境现在已激活,您应该在命令行提示符中看到
(venv)。 - 要停用虚拟环境:
1deactivate
- 打开一个终端。
- 导航到您的项目目录:
1cd path/to/your/project/directory - 使用Python创建一个虚拟环境:
1python -m venv venv- 请注意,在上述命令中,最后一个参数是虚拟环境的名称。在这种情况下,我们将其命名为
venv。
- 请注意,在上述命令中,最后一个参数是虚拟环境的名称。在这种情况下,我们将其命名为
- 激活虚拟环境:
1source venv/bin/activate - 现在虚拟环境已被激活,您应该在命令行提示中看到
(venv)。 - 要停用虚拟环境:
1deactivate
安装翻译后的源代码¶
正如之前所述,翻译后的源代码已被打包到Python包中,并发布到PyPI供方便安装。至少应该安装两个包到虚拟环境中:
-
您正在开发的服务器软件的翻译源代码:
如果您的服务器运行... 那么您应该安装的包是... Spigot pyspigot-spigot-sources Paper pyspigot-paper-sources Purpur pyspigot-purpur-sources Mohist pyspigot-spigot-sources BungeeCord pyspigot-bungee-sources 要安装的版本是您服务器的Minecraft版本。
一些示例:
-
如果您的服务器正在运行Minecraft 1.18.2上的Spigot,请安装
pyspigot-spigot-sources==1.18.2。 - 如果您的服务器正在运行Minecraft 1.21.4上的Paper,请安装
pyspigot-paper-sources==1.21.4。 - 如果您的服务器正在运行Minecraft 1.20.6上的Purpur,请安装
pyspigot-purpur-sources==1.20.6。 -
如果您的服务器正在运行Minecraft 1.19.4上的BungeeCord,请安装
pyspigot-bungeecord-sources==1.19.4。 -
PySpigot本身的翻译源码:
确定要安装PySpigot翻译源码的PyPI软件包更加简单:
| 如果您的服务器正在运行... | 那么您应该安装的软件包是... |
|---|---|
| Bukkit (Spigot, Paper, Purpur等) | pyspigot-sources-bukkit |
| BungeeCord | pyspigot-sources-bungee |
要安装的版本是您服务器上的PySpigot版本。
一些示例:
- 如果您的服务器正在运行Bukkit和PySpigot版本0.8.0,请安装
pyspigot-sources-bukkit==0.8.0。 - 如果您的服务器正在运行BungeeCord和PySpigot版本0.8.0,请安装
pyspigot-sources-bungee==0.8.0。
确定您需要安装哪些软件包后,请按照以下步骤操作:
- 确保之前创建的虚拟环境已被激活:
- 确认命令行提示符中出现
(venv)。 - 运行以下命令:
确认输出包含您刚刚安装虚拟环境的位置。
1 2
where python (Windows) which python (macOS/Linux)
- 确认命令行提示符中出现
- 安装每个包:
注意:这些根据您的服务器软件、Minecraft版本和PySpigot版本而有所不同!如果不确定要安装什么,请查看上面的部分。
1 2
pip install mc-paper-sources==1.21.4 pip install ps-bukkit-sources==0.8.0 - 确认所有包均已正确安装:
应列出您安装的每个包。
1pip freeze
配置 VS Code 使用虚拟环境¶
- 打开 VS Code 并导航到/打开您的项目目录。
- Windows:如果您已经在之前步骤的项目目录中,可以在命令提示符/PowerShell中键入以下内容来打开VS Code:
1code .
- Windows:如果您已经在之前步骤的项目目录中,可以在命令提示符/PowerShell中键入以下内容来打开VS Code:
- 打开 命令面板:
- Windows/Linux:Ctrl + Shift + P
- macOS: + Shift + P
- 搜索并选择Python: Select Interpreter。
- 在出现的列表中,选择位于您之前创建的虚拟环境内部的解释器:
- Windows:./venv/Scripts/python.exe
- macOS/Linux:./venv/bin/python
- 确保所选解释器出现在VS Code 右下角。
- VS Code 现在将自动激活虚拟环境。
如果您为多个服务器软件和/或Minecraft版本编写脚本,必须为每个服务器软件和Minecraft版本创建不同的虚拟环境。将翻译后的源代码安装到同一虚拟环境中的多个不同服务器软件/Minecraft版本中会导致冲突和覆盖。
搞定了!现在,当您编写脚本时,VS Code应该会给出代码建议、自动补全建议,并显示API文档,因为它现在可以从已安装到虚拟环境中的翻译源中提取这些信息。
编写脚本时使用类型提示¶
类型提示对您的集成开发环境很有用,它可以在类型不明确的情况下提供代码建议和自动补全。这种情况出现在为事件监听器、命令、任务和PySpigot从Java调用您脚本中的函数等情况下。例如,请考虑以下注册事件监听器的脚本:
1 2 3 4 5 6 7 | |
- 您的集成开发环境不知道
event的类型,因此无法为这个变量提供任何代码建议或自动补全。
当在player_chat函数内部调用event.<something>时,您的集成开发环境将无法提供代码建议,因为它不知道event的类型。为event参数添加类型提示可以纠正此不明确性:
1 2 3 4 5 6 7 | |
- 现在,IDE 知道
event的类型将是AsyncPlayerChatEvent,因此它现在可以根据AsyncPlayerChatEvent类中的函数提供代码建议。
Note
自从 Python 3.5 引入了类型提示,Jython 将无法解析它们。在运行脚本之前,您必须手动删除它们。我计划在 PySpigot 中添加一个功能,可以在加载脚本文件时自动删除类型提示,以简化用户端的操作。
安装额外的库¶
这个系统的美妙之处在于任何 Java 库的源代码都可以被翻译并安装到您的虚拟环境中,以便在编写脚本时使用。如果您使用了某个外部库,并希望我将其翻译并发布到 PyPI,欢迎在 Discord 上与我联系。
问题¶
由于这是一个新项目,我预计会有问题。如果您遇到任何问题,请在 Discord 或 docs-translator Github 页面 上报告。 ```