代码之家  ›  专栏  ›  技术社区  ›  adder

如何正确地将第三方依赖项与Supreme文本插件一起使用?

  •  0
  • adder  · 技术社区  · 6 年前

    我正在尝试为Sublime Text 3编写一个插件。

    /home/user/.config/sublime-text-3/Packages/User/ ,然后我使用相对导入来获取所需的代码。我如何将插件分发给最终用户?告诉他们将所需的依赖项复制到适当的位置肯定不是办法。第三方模块应该如何与Supreme文本插件一起正确使用?我在网上找不到任何文件;我看到的只是把模块放进文件夹的建议。

    0 回复  |  直到 6 年前
        1
  •  12
  •   OdatNurd    6 年前

    Sublime使用自己的嵌入式Python解释器(目前是Python 3.3.6,不过下一个版本也将支持Python 3.8),因此它将完全忽略系统上可能安装或可能未安装的任何Python版本,以及为该版本安装的任何库。

    因此,如果您想使用外部模块(以下简称 dependencies )你需要做额外的工作。实现这一点有多种方法,每种方法都有各自的优缺点。

    下面列出了实现这一目标的各种方法;所有这些都需要对Python中的模块如何工作有一点了解,才能理解发生了什么。总的来说,除了涉及的路径之外,没有任何关于机制的“崇高文本”。

    注: 以下内容截至回答时准确无误。然而,包控制计划改变它与即将到来的依赖项的工作方式,这些依赖项可能会改变这一点的某些方面。

    这与即将发布的Sublime版本有关,该版本支持多个Python版本(以及它支持这些版本的方式),而当前的包控制机制不支持这些版本。

    目前尚不清楚这一变化是否会带来一种新的方式来指定依赖项,或者是否只有依赖项安装方式的内部工作方式会发生变化。然而,现有的机制可能仍然存在,不管是否只是为了向后兼容。

    通往Python的所有道路 dependency Data 目录),而不是一个独立的Python解释器,Python正在插件主机中运行。

    将库填充到 Lib 文件夹

    自3.0版(build 3143)以来,Sublime将创建一个名为 解放党 在数据目录中,以及其中一个基于Python版本名称的目录。如果你使用 Preferences > Browse Packages 再往上一层,你会看到 解放党 ,其中有一个名为。 python3.3 (或者如果您使用的是较新的版本, python33 和 python38 ).

    这些目录直接位于Python上 sys.path 默认情况下,任何插件都可以立即使用其中的任何内容,就像普通Python库(或任何内置的Python库)一样。你可以认为这些文件夹类似于 site-packages 标准Python中的文件夹。

    因此,任何可以安装标准Python库的方法都可以使用,只要结果是文件最终出现在这个文件夹中。例如,您可以通过安装一个库 pip 然后手动将文件从 网站包 ,从源代码等手动安装。

    Lib/python3.3/
    |-- librarya
    |   `-- file1.py
    |-- libraryb
    |   `-- file2.py
    `-- singlefile.py
    

    附属国 您想要使用的版本必须支持Sublime正在使用的Python版本,否则它将无法工作。这对于带有本机组件(例如 .dll , .so 或 .dylib ),这可能需要手动编译代码。

    这种方法不是自动的;您需要这样做才能在本地使用您的包,任何想要使用您的包的人也需要这样做。由于Sublime目前使用的是较旧版本的Python,因此获得正确版本的库也可能会有问题。

    将来,将安装Package Control 依赖关系 在这个位置(将在3.0版运行期间添加专门用于此目的的文件夹),但截至我撰写此答案时,目前情况并非如此。

    直接在自己的包中提供依赖项

    这个 Packages 系统。路径 默认情况下也是如此;这就是Sublime查找和加载包的方式。这是真实的两个物理 包装 文件夹,以及包含 sublime-package 文件夹。

    exec 命令通过:

    from Default.exec import ExecCommand
    

    即使 exec.py 文件实际上存储在 Default.sublime-package 包装 文件夹

    因此,你可以 vendor 任何 依赖关系 直接放在你自己的包裹里。这里可能是 User

    重要的是要注意,升华将治疗任何 Python 将文件作为插件保存在包的顶层,并尝试将其作为插件加载。因此,如果你走这条路,在你的包中创建一个子文件夹并把库放进去是很重要的。

    MyPackage/
    |-- alibrary
    |   `-- code.py
    `-- my_plugin.py
    

    通过这种结构,您可以直接访问模块:

    import MyPackage.alibrary 
    
    from MyPackage.alibrary import someSymbol
    

    并非所有Python模块都可以不经修改直接使用这种方法;中的一些代码更改 附属国 可能需要,以便允许库的不同部分看到自身的其他部分,例如,如果不使用相对 import 获取兄弟姐妹文件。根据您使用的库的不同,许可证限制也可能会妨碍这一点。

    另一方面,这会直接将您正在使用的库的版本锁定到您测试的版本,从而确保您不会再遇到任何不必要的意外。

    使用这种方法,您分发包所做的任何事情都会自动分发包中包含的供应商库。所以,如果您是通过包控制进行分发的,那么您不需要做任何特殊的事情,它只会起作用。

    修改 系统。路径 指向自定义位置的步骤

    嵌入到Sublime中的Python仍然是标准Python,因此如果需要,可以手动操作 系统。路径 这说明了要在哪些文件夹中查找包,以便在升华自动设置的标准位置之外,还可以在您选择的位置查找包。

    这通常不是一个好主意,因为如果做得不正确,事情很快就会变成梨形。它还要求您首先手动在某个地方安装库,在这种情况下,最好使用 解放党 文件夹,已在 系统。路径 .

    我认为这种方法是一种先进的解决方案,一种在开发过程中可能用于测试的目的,但否则不会是用户所面临的问题。如果您计划通过包控制分发包,那么对包的审查可能会回击对包的操纵 系统。路径 请求使用另一种方法。

    使用包控件的依赖关系系统(并且依赖关系存在)

    包控件包含 dependency mechanism 它使用前面两种方法的组合来提供一种自动安装依赖项的方法。有一个 list of available dependencies 当然,这个列表可能并不完整。

    如果 附属国 你感兴趣的东西已经准备好了,你可以走了。有两种不同的方式来声明您的包需要一个或多个依赖项。

    笔记

    第一个涉及添加 依赖关系 程序包控制通道文件中程序包条目的键。这是在将包添加到包控制时要采取的步骤,这超出了本答案的范围。

    在开发包的过程中(或者如果完成后决定不想通过包控制分发包),可以添加 dependencies.json 文件放入包的根目录中(一个 example dependencies.json 文件可用于说明这一点)。

    一旦你这么做了,你可以选择 Package Control: Satisfy Dependencies 从命令调色板下载软件包控件,并为您安装依赖项(如果需要)。

    如果软件包由软件包控制分发和安装,则此步骤是自动的;否则,在用户安装软件包后,您需要告诉他们执行此步骤。

    使用包控件的依赖关系系统(但依赖关系不存在)

    Package Control用于安装的方法 依赖关系 正如问题顶部所述,在未来(可能在不久的将来)可能会发生变化。这可能会影响此处的说明。就设置而言,整体机制可能保持不变,只是安装位置发生了变化,但目前仍有待观察。

    Package Control通过以下特殊组合安装依赖项: vendoring 还有操纵 系统。路径 让东西被发现。为了做到这一点,它要求您以特定的方式布置您的依赖关系,并提供一些额外的元数据。

    构建包含依赖项的包时,其布局的结构类似于以下内容:

    Packages/my_dependency/
    ├── .sublime-dependency
    └── prefix
        └── my_dependency
            └── file.py
    

    包控件安装一个 附属国 作为一个包,由于升华将包根中的每个Python文件都视为一个插件,因此依赖项的代码并不保留在包的顶层。如上所述,依赖项的实际内容存储在标记为 prefix 上图(稍后将详细介绍)。

    安装依赖项后,包控件会向其特殊 0_package_control_loader 导致 前缀 要添加到文件夹的文件夹 系统。路径 ,使其内部的所有内容都可供用户使用 进口 声明正常。这就是为什么图书馆的名字与生俱来的重复( my_dependency 在本例中)。

    关于 前缀 文件夹,它实际上并没有命名为that,而是有一个特殊的名称,它决定了依赖项在什么样的崇高文本版本、平台和体系结构组合上可用(例如,对于包含二进制文件的库很重要)。

    那个人的名字 前缀 文件夹实际上遵循以下格式 {st_version}_{os}_{arch} , {st_version}_{os} , {st_version} 或 all . {st_版本} 可以是 st2 或 st3 , {os} 可以是 windows , linux 或 osx 和 {arch} 可以是 x32 或 x64 .

    因此,你可以说你的依赖关系只支持 st3 , st3_linux , st3_windows_x64 或其任何组合。对于使用本机代码的东西,您可以通过拥有多个文件夹来指定多个不同的版本,尽管通常是这样 全部的 当 包含纯Python代码,无论其版本、操作系统或体系结构如何,都能正常工作。

    在这个例子中,如果我们假设 前缀 文件夹名为 全部的 因为 我的依赖 如果是纯Python,那么安装此依赖项的结果将是 Packages/my_dependency/all 将被添加到 系统。路径 ,意思是如果你 import my_dependency 你从文件夹里得到了代码。

    在开发过程中(或者如果不想通过包控制来分发依赖项),可以创建 .sublime-dependency 文件位于包的根目录中,如上所示。这应该是一个文本文件,其中一行包含一个2位数的数字(例如。 01 或 50 )。此选项控制每个已安装的依赖项将以何种顺序添加到 系统。路径 .如果你的依赖项没有其他依赖项,你通常会选择一个较低的数字,如果它有其他依赖项,你会选择一个较高的值(这样它就会在这些依赖项之后被注入)。

    一旦以正确的格式在 包装 文件夹,您可以使用以下命令 Package Control: Install Local Dependency 从命令选项板中,然后选择依赖项的名称。

    这会导致包控制“安装”依赖项(即更新 0_包_控制_加载器 包)使依赖项处于活动状态。当Package Control第一次安装依赖项时,通常会自动执行此步骤,因此如果您也要手动分发依赖项,则需要提供执行此步骤的说明。