一个python框架,用于在python环境中构建用于处理node.js生态系统的工具链和实用程序。
calmjs的Python项目详细描述
钙
一个python框架,用于构建用于工作的工具链和实用程序 在python环境中使用node.js生态系统。
简介
calmjs为 python和python包的运行时 开发人员一个定义良好的接口,用于在 node.js/javascript开发工具和 它们的python包,以便与 python环境中的node.js/javascript环境可以是 提供便利。calmjs框架的目标是帮助 python包的开发、测试和部署 包括和/或与外部javascript代码集成。
方法论
首先,这是通过向python包提供 声明对node.js/javascript包或源文件的依赖关系 必须完成其功能。这个共同的框架 将确保在公共协议下这些元数据的可访问性, 避免不可移植的不兼容声明 不同的项目和环境,或者分散在 不同的工具或位置或在同一工作中重复 由不同的工具集构成的环境。没有共同的框架, 结果是python包将无法正确地 在彼此之间传递它们的非python需求和状态, 在建设、开发和部署 软件堆栈,和/或成为这些进程的错误源。
其次,通过提供一组构建在这个可扩展的 使用这些声明生成 所需node.js工具的配置文件,以便它们可以 为其构建所需的生成和/或运行时环境 功能。
最终,这允许更好地将node.js与给定的python集成 环境,降低实现连续性所需的工作量 python包与 node.js/javascript包,可复制。
实施
为了实现这一点,calmjs框架提供了一组 扩展到帮助跟踪和管理的setuptools 基于javascript或node.js的包(例如 对于给定的python包,通过 npm )。它还提供了一个数字 可以用来构建自定义工具链 实施不同的管理和编译策略 将javascript代码和相关资产放入 应用服务器可以使用或生成测试工具来确保 开发和生产环境下的正确性。 这些额外的功能将由其他python包提供 在 calmjs 名称空间下实现这个模块 建筑。
calmjs这个名字最初源于 工具链的迭代,包括编译,组装, 并使用 宿主python包。标志中的"M"是兔子的耳朵。这个 这个动物被选为这个项目的吉祥物是因为 他们的饮食习惯,就像javascript代码一样 通常由其他工具转换为最低可用级别 框架。
功能概述
< DL>到 setuptools 命令挂钩, calmjs 提供python 能够声明和管理清单定义的包 基于node.js的包管理系统的文件(例如 package.json 用于 npm )。在典型用法下,这意味着 声明 可以跟踪给定python包所需的javascript包, 都在通过扩展的setuptools框架内 由calmjs提供。
这个基础结构的另一部分是 遵循python包依赖关系图。开发人员和用户 可以使用 calmjs 控制台命令入口点,或通过 setuptools ,生成清单文件以便于 安装python包所需的node.js包 在已完成的应用程序堆栈中,为所有 手头有包裹。
包含相关javascript源代码的给定python包 在同一python模块和命名空间结构中的代码 python源代码在源树中,将能够声明 这些命名空间作为 通过setuptools条目获得完全相同的python包名称空间 点:
这些声明将通过 其他包的 calmjs 模块注册表系统 通过框架提供的api声明 遵循相同声明的模块和命名空间的javascript代码 结构。默认模块注册表将使用 / 字符(而不是像python中那样的 字符)作为 由于中已建立的命名约定,名称的分隔符 javascript(以及面向未来的es6)。
使用calmjs框架的其他工具可以使用 这些原始javascript源文件与本地 node.js环境,或生成用于在 网状物。这将导致…
这是通过提供构建工具链的框架来实现的 对于node.js/javascript使用javascript编写的工具 与现有python包正确集成的环境 以及环境。
对于如何使用或如何使用 工具或源文件,作为实现保留 细节。有关示例,请参阅//pypi.python.org/pypi/calmjs.rjs" rel="nofollow"> calmjs.rjs python 包,它允许从 嵌入在python包中的javascript包,或者 calmjs.webpack 与 制作另一种常用的捆绑工件格式。
通常,可以构建工具链来查找和加载所有python 具有任何 javascript源文件,以及那些将被提取的文件,通过 适当的开卷机(如果有的话)以建立可部署的 人工产品。可设置测试线束以帮助机组运行 测试、功能测试和自然的最终集成测试 成功部署所需。
到目前为止所描述的特性是建立在 类和模块,以便支持附加的javascript 处理脱毛的工具或自定义过程可以非常简单 为几个类创建一个新模块 带有相关设置工具入口点的参数。
事实上, calmjs 开箱即用的只有核心 框架加上 npm / 纱的连接部分,带支架 对于工具,如作为完全独立的包的 bower 或 r.js 。 (分别为 calmjs.bower 和 calmjs.rjs ),以便 不需要此功能的项目、环境或站点 这些软件包只需选择不安装即可。
安装
因为calmjs的目标是集成node.js和npm(或yarn)。 在python环境中,它们需要在 环境;如果未安装,请按照安装 适合目标操作的node.js的步骤 系统/环境/平台。
要将calmjs安装到给定的python环境中,请执行以下操作 可以执行命令直接从pypi安装:
$ pip install calmjs
替代安装方法(针对开发人员、高级用户)
对于最新的特性和 错误修复,开发版本可以通过git安装,就像这样:
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs
注意,可编辑安装的 -u标志是为了确保 将setuptools升级到最新版本以避免出现问题 处理开发包的名称空间,在 下一段。
或者,可以直接克隆git存储库并执行 python setup.py在源代码的根目录中开发 但是,如果使用 任何早于v31的setuptools版本都将不一致 导入 calmjs 命名空间下的模块时出错。各种各样 命名空间导入失败的症状记录在 本文档的故障排除部分。
测试惯性导航系统计数
为了确保 calmjs 安装正常工作, 内置测试套件可以通过以下方式执行:
$ python -m unittest calmjs.tests.make_suite
如果出现故障,请在问题跟踪程序中使用 完整的回溯和/或安装方法。也请 记住要包含特定于平台的信息,比如python 版本、操作系统环境和版本以及其他相关 与当前问题相关的信息。
主要功能的用法和说明
当安装到特定的python环境中时, calmjs 命令行实用程序将在其中可用。
$ calmjs usage: calmjs [-h] [-d] [-q] [-v] [-V] <command> ... positional arguments: <command> artifact helpers for the management of artifacts npm npm support for the calmjs framework yarn yarn support for the calmjs framework optional arguments: -h, --help show this help message and exit global options: -d, --debug show traceback on error; twice for post_mortem '--debugger' when execution cannot continue -q, --quiet be more quiet -v, --verbose be more verbose -V, --version print version information
如前所述, npm 支持是内置的,因此它始终可用;到 访问其帮助,只需执行 calmjs npm -h ,然后将列出 可用于该特定子命令的选项。如果其他 子命令可用(将由其他 calmjs 集成包)它们将被列为 <;command>; 和 将以相同的方式访问特定的帮助消息。
为给定的python包声明package.json
如果包希望声明对由npm托管的包的依赖关系, 它可以在其 设置中执行类似的操作。py :
fromsetuptoolsimportsetuppackage_json={"dependencies":{"jquery":"~3.0.0","underscore":"~1.8.0",}}setup(name='example.package',# ...setup_requires=['calmjs',# plus other setup_requires ...],package_json=package_json,# ...)
注意, 安装程序需要 节必须指定 calmjs ,以便 为生成 package.json python时给定包的元数据文件 setup.py egg_info 被执行(直接或间接),这样即使 如果当前python中尚未安装calmjs 环境,它将从pypi获得并作为 设置工具的设置过程,并且不直接依赖于 给定的包。如果 提供的数据是有效的json字符串或没有 不兼容的数据类型。例如:
$ python setup.py egg_info running egg_info writing package_json to example.package.egg-info/package.json ... $ cat example.package.egg-info/package.json { "dependencies": { "jquery": "~3.0.0", "underscore": "~1.8.0" } }
使用setup需要的关键原因是不强制给定 包的依赖项将 calmjs 作为其依赖项的一部分,作为 通常这只是开发人员的要求,而不是 最终用户。这也意味着对于想要使用calmjs的开发人员来说 和实用程序它们必须单独安装(即 pip install 或者通过 使用附加标志需要 ,例如:
setup(name='example.package',# ...setup_requires=['calmjs',# ...],extras_require={'dev':['calmjs',# ... plus other development dependencies],},# ...)
然后使用 附件下列出的依赖项:
$ pip install -e .[dev]Obtaining file://example/package ... Installing collected packages: ..., calmjs, ... Running setup.py develop for example.package Successfully installed ...
注意,现在 calmjs 包仍然安装在python中 环境和它们提供的实用程序现在可以使用,包括 以下部分。
跨python包依赖项使用 package.json
将 package.json 文件写入包元数据 目录,诸如 calmjs 之类的实用程序可以利用它。一种方法 要做到这一点,需要通过该包的 setup.py 。通过调用 setup.py npm --init 从那里,一个新的 包.json 组合在一起 在 给定包的python包依赖项,将写入 当前目录。这类似于运行npm init 区别在于依赖关系也通过 给定python包的python包依赖树。
请注意,这需要创建和处理 G有能力Iven包(请参阅上一节 必须正确安装所有依赖项 并且可以从当前的python环境中导入。
或者,可以使用 calmjs npm 实用程序。调用calmjs npm --init 示例。来自命令行的package 将实现相同的功能 在文件系统的任何地方,只要 calmjs 和 示例.package 是通过当前 python环境的导入系统。更多细节和信息 关于此实用程序,请参阅与 npm的集成。 通过calmjs npm 部分:
处理与python包依赖项的依赖项
平的比嵌套的好。所以所有依赖项 任何上游python包声明的devdependencies 由其所有下游包自动继承,但它们具有 通过这个机制用他们想要的任何东西覆盖它的选项 如上所述。他们可以将javascript或node.js包设置为 无论需要什么版本,甚至只是简单地删除依赖项 完全通过将版本设置为 无
每当calmjs需要一个实际的 包.json 时, calmjs npm 实用程序将展平 python包到一个文件中,然后传递到 各自的javascript包管理器。这个过程是 当a calmjs 工具链或实用程序使用这些 声明信息以生成要实现的所需工件 无论手头有什么需要的任务。
当然,如果包的嵌套样式和依赖项 样式为 npm 是理想的,没有人被迫使用它,它们是免费的 使用任何工具解释或使用任何数据文件 以及可用的依赖项,和/或将其包拆分为python 和javascript位,并在两个pypi上部署和托管它们 (对于 pip )和 npm ,然后找出如何 它们以连贯的方式重新组合在一起。不要问(或和)争论 作者就后一种选择对每个人来说是更好还是更容易 (开发人员、系统集成商和最终用户)参与。
声明节点模块内部路径的显式依赖关系
假设对源于 显式指定了from npm ,构建工具将再次受益于 对这些包中所需文件的显式声明。即, 编译的包可以在 json字符串很像包json,就像这样:
extras_calmjs={'node_modules':{'jquery':'jquery/dist/jquery.js','underscore':'underscore/underscore.js',},}setup(name='example.package',...extras_calmjs=extras_calmjs,...)
由于node_modules 被声明为一个extras_键,因此有冲突 将解析环境中包之间的声明 并以与在中声明的依赖项冲突相同的方式合并 包json
请注意,必须声明完整的路径名(注意 .js 示例中包含文件名后缀;目录可以 也要申报。但是,由于这些声明是从内部完成的 python需要显式的完整路径,因此它一直到下游 正确处理和/或将其转换为 标准node.js工具可能期望的约定(即 .js 省略文件名后缀。
从python包导出javascript代码
在前面的例子中,如果 示例.包的布局如下:
$ pip install calmjs
0
宣布在 /example/package 中编写源文件 通过 calmjs 的javascript模块,入口点可以声明为 所以在 setup.py 文件中:
$ pip install calmjs
1
请注意,入口点的名称不相关;该入口点 名称被忽略,因为默认模块注册表的目的是 提供直接映射到同一导入命名空间的模块名 作为源python模块,但是使用es5名称空间分隔符 / ,而不是python中的 字符。如果 需要映射,可以定义一个新的模块注册表类 使用提供的名称作为来自javascript的commonjs导入名称 代码:
默认方法将公开两个源文件,如下所示 姓名:
$ pip install calmjs
2
对于某些项目,可能不希望允许这种自动化方法 从 给定python模块。
为了解决这个问题,可以声明新的模块注册中心 通过calmjs框架。前提是 模块注册表 子类设置正确,以便从 给定包,只需将其声明为 calmjs.registry 入口点 像这样:
$ pip install calmjs
3
请注意,虽然入口点名称所允许的名称是 不受限制,这些注册表名应该是标准的虚线 命名空间格式,以确保最大程度的工具兼容性 通过使用此系统的工具从命令行指定。
声明注册表后,只需将 calmjs.module 替换为 它的名称,以及一个 calmjs_module_registry 属性 声明此 示例。module registry是要使用的默认注册表 带着这个包裹。
$ pip install calmjs
4
在calmjs框架中,可以显式地将工具指定为 从注册到的任何或所有模块注册中心捕获模块 框架。还定义了另一个登记处。如果入口点是 声明如下:
$ pip install calmjs
5
命名空间和模块的分隔符将使用 字符而不是 / 。但是,如果 字符是 javascript模块的有效名称,使用此名称可能会产生问题 使用某些javascript工具。而基于amd的模块系统可以 通常处理导入中的 字符而不出现问题,允许 在 然而,javascript环境可能会导致与 因此,其他javascript库不使用此命名方案 推荐。
默认情况下,还会声明另一个后缀为 的注册表。 作为对先前引入的注册表的补充 可以使用来声明 已声明的各个模块。例如:
$ pip install calmjs
6
与第一个示例非常相似,它声明 example.package 为 python命名空间模块,用于导出javascript代码,其中 后续声明部分是包含测试的模块 第一个伴奏。
向加载程序提供附带的资源文件
某些node.js构建工具和框架支持 其他资源文件的"加载程序",通过相同的导入/要求 javascript模块的系统。提供最基本的支持 减轻包创建者公开其他资源所需的工作 文件到node.js工具导入系统,一个辅助加载程序 注册表可以与父模块一起声明和使用 注册表。在前面的示例上进行扩展,如果以下入口点 定义:
$ pip install calmjs
7
calmjs.module.loader注册表将引用其父注册表 calmjs.module 对于摆姿势,所以 它将使用声明的文件来获取所有相关的文件名 按名称扩展到特定加载程序的名称。与基本模块不同 注册表,模块加载程序注册表将忽略python模块名 部分,而名称(在左侧)是所需的加载程序, 附加(用逗号分隔的标记括在 [] 之间)是 要从包中获取的文件扩展名。因此 以前为example.package定义的条目如下 如果目标资源文件存在,则require 语句应解析 对于套餐:
$ pip install calmjs
8
因为注册表生成的值遵循标准的工具链 规范编译条目语法,这应该满足最基本的用例 并且可以直接作为calmjs_模块注册表包含 包裹。但是,所提供的javascript代码中的实际用法 与集成/交互的实际工具链包结合 与各自的node.js包可能有以下交互 需要特殊处理(例如包括/排除 为最终工件生成的段,或者这些源如何 是别名还是对系统可用,或者是否 注册表本身需要手动集成);请参阅 与此相关的特定集成包的文档 特定注册表类型。
最后一点注意:由于python入口点系统的限制, 假定文件扩展名都是小写。
与 npm整合 至 calmjs-npm整合
如前所述,可以使用 包.json 从setuptools外部生成功能。用户可以很容易地 通过内置的calmjs npm工具进行同样的操作:
$ pip install calmjs
9
当然,上面显示的与 可以使用setuptools 框架,但是包名可以是 提供用于从任何地方生成target package.json 文件 在文件系统上,前提是python环境具有 已安装必需的软件包。例如,如果node.js包 example.package 要安装,可以调用它来查看 将生成的package.json :
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs0
如果当前文件中已经存在一个 package.json 文件 使用带有 --init 或 --install的 -i 标志的目录 显示生成的版本与 现有版本,并提示执行操作。
工具链
关于如何扩展toolchain类以支持用例的文档 当前不完整。这通常与 calmjs.runtime.driverruntime 连接到 calmjs 运行时。
不幸的是,现在有一个关于如何创建一个完整的 实现未完成(仅类中的文档 不过,是)。关于如何实现这一点的工作示例,请 请参阅 calmjs.rjs 或 calmjs.webpack
工具链建议
对于需要提供附加说明的包开发人员 工具链执行(例如,为了在RequireJS和 一个给定包的特定功能用例的网页包)。 工具链系统还将使用通知系统,以便 可以创建和注册附加说明以供使用和重用 他们的家属。MUCh与工具链一样,此功能当前 缺少测试用例之外的文档。
通过设置工具生成预定义工件
可以定义要为给定的 包装和规则。只需定义一个返回 calmjs.toolchain.toolchain子类的实例 与所需的工具和一个 calmjs.toolchain.spec 对象集成 有必要的规则。这些特定功能通常由 提供它们的包,请参考工具链包 在上一节中列出并链接以获取有关如何 这些可以使用。
由于这些也是通过注册表系统实现的,所以 点通常如下:
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs1
在本例中,来自模块的 builder 函数 example.toolchain 用于生成 complete.bundle.js 文件。生成的工件文件将位于 包元数据目录中的目录 (以 .dist info 或 .egg info 结尾的一个)。 包裹。附带的calmjs_artifacts.json 文件也将是 生成,列出了 涉及到工件的构造,以及二进制文件的版本 用于任务的。
当 build_calmjs_artifacts 设置为 true 时, 通过 setup.py构建自动生成这些工件 步骤将启用。这对于自动绑定 发布版的工件文件,如python wheels(例如运行 setup.py bdist_wheel 也将生成声明的工件。 否则,可以使用 setup.py build_calmjs_工件 或通过 calmjs工件构建工具。
故障排除
以下是典型的 使用 calmjs
由于严重错误,critical calmjs.runtime终止
如果 calmjs 遇到任何意外情况,它可能会像这样中止:
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs2
如果之前没有列出有用的错误消息,请再次尝试运行 使用调试标志(要么 -d 要么 --调试 )。
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs3
两次指定调试标志将启用 事后分析 模式, 调试程序将在故障点被触发。作者 实现运行时类的包,这些运行时类为 calmjs 命令在开发周期中可能会发现这一点非常有用。 请注意,只有在顶级 运行时类启用用法(实现 如果故障发生在 调用运行时类。任何其他错误或异常 在 calmjs 运行时的设置阶段发生 以较低的优先级记录(例如,在 安装阶段可见,必须提供其他详细标志。
错误错误的"calmjs.runtime"入口点
< DL>随机 导入错误
由于 calmjs 同时声明为名称空间和包,因此 工作python环境中需要的低级设置 确保内的所有模块都能正确定位。然而, 早于v31.0.0的版本的setuptools不会创建 安装包时所需的包命名空间声明 使用开发安装方法(例如使用python setup.py 在python环境中与其他环境一起开发 通过同一命名空间中的 pip 安装的包。 失败可以表现为任何模块的不一致导入失败 在 calmjs 名称空间下。例如:
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs4
它也可能以不同的方式出现,例如 attributeerror 可通过执行 calmjs的unittests来触发:
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs5
要解决此问题,请确保将setuptools升级到v31或 更大,可以通过pip安装/升级,就像这样:
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs6
然后重新安装calmjs 命名空间以解决此导入问题。
忽略/不传递给底层工具的环境变量
一般来说,calmjs框架过滤掉了所有的环境 默认情况下,除了最小值之外的变量,并且只传递 基础工具的数量有限。这是 路径和 节点路径 变量,加上要启用的平台特定变量 脚本和二进制文件的执行。
在声明的参数上运行时报告"无法识别的参数"
对于calmjs>;=3.1.0,应完全解决此问题。
ArgumentParser中的默认行为默认为无用的责备 子参数导致的任何无法识别参数的根分析器。 calmjs-3.1.0之前的原始解决方案失败如下 下面记录了它的子解析器实现 不完整。任何一种误导行为都会阻碍最终用户 无法快速定位错误的参数标志。
例如,如果执行 calmjs 命令,则 错误消息可能如下:
$# standard installation mode $ pip install git+https://github.com/calmjs/calmjs.git#egg=calmjs $# for an editable installation mode; note the upgrade flag $ pip install -U -e git+https://github.com/calmjs/calmjs.git#egg=calmjs7
这意味着第二个子命令无法识别 --标志 (即 calmjs subcmd1 subcmd2 命令)放在 subcmd2 ,但subparser for subcmd1 将其标记为错误。 不幸的是,argparse模块中有许多问题 所以很难完全解决这个问题 时间请确保在正确的子命令级别提供标志 (即,在这种情况下, calmjs subcmd1 --标志 项subcmd2 ),否则 通过在每个 有效的子命令。
模块注册表未找到来自namesp的文件ace包
中有许多与命名空间包关联的边缘案例 python,特别是通过 方法(即拉链鸡蛋、轮子和开发包的混合)。 而处理给定的命名空间模块的工作区 提供了软件包,但存在一些限制。一个这样的原因 是因为处理压缩鸡蛋的复杂性;如果这是个问题, 请确保受影响的包已声明为 false,或者生成一个python轮,然后安装该轮, 如果目标python环境将其作为标准安装 格式:
用户警告:未知的分发选项:"package\u json"
这也适用于其他相关选项,因为它是由 执行 setup.py 而不使用 calmjs 设置工具,以便保留这些关键字的处理方法 未定义。这可以通过提供 calmjs 作为 安装程序需要 节。有关这方面的更多信息,请参见 使用包json部分。
贡献
- 问题跟踪器:https://github.com/calmjs/calmjs/issues rel="nofollow">https://github.com/calmjs/calmjs/issues
- 源代码:https://github.com/calmjs/calmjs" rel="nofollow">https://github.com/calmjs/calmjs
法律
CALMJS项目版权所有(c)2016奥克兰生物工程 奥克兰大学研究所。 calmjs 根据条款获得许可 GPLV2或更高版本。