包索引管道

pipl的Python项目详细描述


pipl

包索引管道

基于pip/devpi的实验性管道依赖平台

为什么

我听过很多次"CG生产很难实现工业化,因为 每一部作品几乎都是一个原型。 作为一个开发者,这个借口让我很困扰,因为如果有人认为CG 作品是原型,他如何处理发展——创造的艺术 解决以前从未(正确)解决过的问题的东西:d 这就是它的原型!

然而,软件开发已经找到了工业化的道路,所以 应该是CG生产。

所以我开始比较cg项目的经典部分和dev部分,并且 我突然想到:两者之间没有什么区别,让我们使用devop 建立CG管道的工具。

pipl试图实现这个想法。(阅读"概念证明/原型")

如何

cg管道核心的一个基本模块是依赖关系 管理。pipl背后的思想是使用python的打包系统作为 中央依赖解析程序。

一旦管道的每一位都可以表示为一个python包, 所有依赖项都由一个文档化的、健壮的和通用的 生态系统(感谢python打包机构:www.pypa.io

像setuptools,pip,virtalenv,pipenv这样的官方pypa工具…可以使用 要解决独立环境中的依赖关系,请管理更新、支持 RC版本、锁依赖项等。

这个想法也提供了一个很好的机会:使用ci/cd系统对包做出反应 出版。有毒物的质量保证是一个显而易见的想法,但是如果 ci/cd系统用于执行处理来自 上游包和生成/更新+发布包。

这将利用将所有内容都视为python包的另一个巨大优势:它本质上是过程性的和可执行的,因此所有都可以成为 程序性和可执行性。

"我应该使用哪个版本的玛雅来打开此场景?"不再是个问题了: 假设任务"shot 303-909animation"是一个python包,带有控制台脚本入口点,比如"openscene"。此命令只需激活一个virtualenv即可使用,并通过向任务包添加依赖项进行完全配置。

pipl不是专门用于shell的。cli是第一个公民,但是我们需要一个很好的python api 2,这样就可以很容易地在上面添加一个gui/工作流系统(我们的计划包括使用www.kabaretstudio.com rel="nofollow">www.kabaretstudio.com来实现这一点)

最后但并非最不重要的是,使用python包获得的另一个不错的特性是入口点系统。通过将其用作插件系统,pipl_pipe定义了一个非常可定制的框架:几乎每个方面都可以通过简单地安装一个包来覆盖。该系统还具有很强的可扩展性,您可以自由地实现任何管道和工作流。

概述

您将创建并配置一个项目,然后在工作区内安装或开发您的管道,然后将它们发布到项目索引。 使用管道作为依赖项,您将创建任务包,这些包将为用户提供创建和编辑资产的工具。 当用户发布任务包(到阶段索引)时,ci/cd处理程序将测试它们(qa),并将它们推送到另一个阶段索引,在该索引中,另一个ci/cd处理程序将处理它们以创建产品包,该包存储对其关联的资产的引用。这些产品将被一些其他任务用作依赖项,依此类推…

piplcli工作流如下所示:

  • 创建项目它是一个内部有特殊结构的文件夹。
  • 启动项目服务器 这是一个devpi服务器,所有包都将存储在其中。 这就像我们自己的个人圆周率……
  • 配置项目 服务器启动后,有几个重要步骤:
    • 您应该更改根密码,默认值为"。
    • 必须创建默认包索引
    • 您可能需要添加一些"用户"(索引所有者)
    • 您可能需要添加一些临时索引。
    • 必须将pipl pipe packl上载到defaut包索引 (注意:尚未实现-l o l
  • 创建工作区(可选,有默认工作区) 它是一个知道它属于哪个pipl项目的文件夹。
  • 创建工作区 它是工作区内的一个文件夹,包含一个virtualenv,可以编辑 包裹。
  • 创建packl 这是一个带有特殊填充的python包,使其更简单,并且可以通过编程控制。 packl可以包含任意python代码,也可以表示ataks或aproduct
  • 添加依赖项 这将从项目索引中安装一些packl并将它们"链接"到packl。
  • 编辑packl
    • 如果它是一个代码包,比如配置/实现管道的代码包(envset、configs、editors、asset type、asset store、product type等等),那么您应该能够使用您喜欢的ide。
    • 如果是一个任务包,它应该提供一些工具来自动编辑它们。只需启动工作区外壳即可使用这些工具。
    • 如果它是一个产品包,生成它的任务将处理第二版。
  • 发布packl 根据您的工作流,您将直接发布到项目索引或阶段索引,在该索引中,ci/cd处理程序可以运行qa或处理工具。

管道实施

那么如何在这个系统中"定义我的管道"?

Note: This is not functionnal yet and very likely to change A LOT :p

管道的核心功能,即"管道框架",由pipl_管道包提供。这就是资产、产品、任务等的概念…是有定义的。这就是给你定义自己的工具。

pipl_pipe packl定义pipl_pack.services对象。 由于项目中的每个packl都将直接或间接依赖于pipl_pipe packl,因此此对象在任何地方都可用。

它包含"服务",如提供命名配置指令的配置,资产存储根据产品、资产类型名称和资产版本解析资产路径。

定义管道的第一步是声明配置、资产类型等…这样做,pipl_pipe使用入口点系统。

配置

入口点将自动加载为由入口名命名的配置。 在setup.py(或者更可能是setup.py)中,您只需要拥有:

entry_points = {
    'pipl_pipe.config': [
	# This is your asset_store config:
        'asset_store = my_config:ASSET_STORE_CONFIG',
        # You can define whatever name you want:
        'kabaret = my_config:KABARET_CONFIG',
    ]
}

资产类型

请注意,术语asset在这里可能不像您习惯的那样使用。 我们所说的"资产"是指"由用户或流程生成的文件或文件夹,每一代都有不同的版本/修订版"。 更实际地说,资产是不能嵌入到python包中的文件,很可能是因为它们太大了。

pipl接受这些文件是受git lfs启发的:只需在包中保存对资产的引用并将其存储委派给(在我们的例子中,是到asset\u store服务)

您想要定义自己的资产子类的原因是,资产负责其托管文件的基名。所以实现rong>命名约定是通过定义资产类型来完成的(同时覆盖负责资产管理文件路径的资产存储服务,请参见下面的"自定义服务"部分)

Note: This bothers me and we'll probably find a proper way to have all the naming convention implemented is Asset only, or in the asset_store only.

定义资产类型很简单,只需继承pipl_pipe.asset_store.asset并使用pipl_pipe.asset_store.register()decorator注册您的公共资产类型:

from pipl_pipe.asset_store import Asset, registered

class _MayaScene(Asset):
    pass

@registered
class MayaAscii(_MayaScene):
    def __init__(self, storage, product, asset_name):
        super(MayaAscii, self).__init__(
            storage, product, asset_name, 'ma'
        )

这意味着,要使用特定的资产类型,您需要依赖于定义它的包您需要导入它(否则不会触发注册)。

这是为了避免用未使用的资源污染您的python。由于您可能在一个包中实现所有资产,因此使用入口点将加载所有资产。使用经典的导入方法,您可以将它们拆分为子模块,只加载所需的子模块。

Note: this is an obvious case of early optimisation and is likely to get replaced by entry_points :p)

定制服务

服务加载在入口点组pipl管道上。服务,带有服务的名称。只需提供一个工厂函数(或类),它接受一个配置作为参数。如果存在同名配置,则会自动提供该配置。

例如,您将如何提供自己的资产存储服务。(注意:这在当前进口中是不正确的,但很快就会^^)

您甚至可以添加自己的附加服务,而不必覆盖现有的服务。

产品

产品是你最想做的部分。它们定义了所有的过程和应用它们的所有代码。

产品是包含实例化产品类的代码的packl。

packls的每个资产都有enty_点数,使管理工具具有 对给定工作区的所有资产执行操作(即复制工作区资产存储中的所有资产,并且能够在不访问项目的情况下工作)

产品具有(键入的)入口点,因此依赖于它们的产品和任务可以访问它们。产品基类具有根据其类型获取依赖关系的函数。

产品类型在任务服务中提供。使用入口点pipl管道安装。任务类型

每个产品都依赖于声明其产品类型的包。

NB: using a service to get a base class feels weird :/ 

TODO: polish this section (how to declare product types ?)

任务

任务是一种特殊类型的产品。

如果您知道为什么我们在开发库时必须使用抽象依赖项,而在开发应用程序时必须使用具体依赖项,请知道产品是库,任务是应用程序。

如果你不在乎,就不要在意;)

任务是包含实例化任务类的代码的packl。

a任务定义(通过入口点)可执行命令(使用上游packls构建场景、使用特定场景打开maya、查看图像序列,…),并可以编辑/创建/发布包(产品)。

这是您构建场景的地方,让用户编辑它,然后从中导出/渲染产品(在ci/cd处理程序中)

每个工作区应该只有一个任务(我不知道为什么,但它感觉很重要,我可能稍后会找到原因;)

任务创建是通过创建新的packl并在工作区shell中执行命令create_task<;packl_name>;<;task_type>;来完成的。 此命令由pipl_pipe声明,并将编辑packl init_uuuu.py和packl setupl_uuu.py以将其转换为所需的任务。

任务类型在任务服务中可用。使用入口点pipl管道安装。任务类型

TODO: polish this section (Task type declaration)

环境集

envset是实例化envset类的packl。

它们的目的与您使用rez所做的很接近:基于依赖项和指定的需求解析环境变量。

每个依赖项+需求都有一个envset包NT,因为我们同时处理包依赖项。

Note: EnvSet are not yet implemented (nor well defined)

工具/编辑器

任务提供命令,但这些命令不需要在任务中定义。工具/编辑器包将用作额外的"编辑"要求,并将使用envset定义命令。

编辑器依赖项将只安装在用户工作区中(而不是在ci/cd工作区中),这是因为需要额外的机器。

Note: This is not well defined yet.

安装

创建虚拟环境,使用pip安装和更新:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
0

用法

包定义了pipl命令行工具。

使用pipl--help列出可用的命令:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
1

使用pipl命令--help列出子命令:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
2

适当时,命令将猜测当前的项目/工作区/包 从当前路径。使用额外的参数覆盖当前路径。

项目初始化

创建一个项目并导航到它:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
3

在同一个virtualenv中打开一个新shell并启动项目的服务器:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
4

现在在第一个shell中,您可以列出用户:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
5

根目录的默认密码是空字符串。 管理命令将需要它,请确保在命令行中使用""而不是""。

最好是尽快更换:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
6

现在您可以使用新的根密码创建一些用户:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
7

你需要一些索引来存储你的包。默认值可以是 创建方式:

代码块::文本

Note: This is not functionnal yet and very likely to change A LOT :p
8

创建工作区

Note: This is not functionnal yet and very likely to change A LOT :p
9

包创建

Note: This is not functionnal yet and very likely to change A LOT :p
9

软件包设置

Note: This is not functionnal yet and very likely to change A LOT :p
9

套餐版

Note: This is not functionnal yet and very likely to change A LOT :p
9

包上载

Note: This is not functionnal yet and very likely to change A LOT :p
9

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在JUnit5中定义优先级   Web驱动程序将焦点切换到iframe的java困难   java JFileChooser没有文件名文本字段选项   本地化是否可以回退到Java中resourcebundle的宏语言(例如,nynorsk>norsk)   禁用时Java断言的性能拖动   未考虑执行中的java jsonschema2pojo maven插件配置   java微调器。setSelection未调用setOnItemSelectedListener函数   序列化XStream:序列化java的反序列化。sql。时间导致错误   java无法理解为什么“ajpnio8009execXX”线程在AbstractQueuedSynchronizer$ConditionObject上阻塞/等待时间。等候   Java date给我的格式是mm/dd/yyyy,其中jquery datepicker的日期格式是dd/mm/yyyy   jsf如何用javaweb应用程序在客户端重写csv文件   雅加达ee Java邮件Api,无法从outlook客户端读取“.msg附件”   java PreparedStatement性能调优