包索引管道
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处理程序将处理它们以创建产品
包,该包存储对其关联的资产的引用
。这些产品
将被一些其他任务用作依赖项,依此类推…
pipl
cli工作流如下所示:
- 创建项目它是一个内部有特殊结构的文件夹。
- 启动项目服务器 这是一个devpi服务器,所有包都将存储在其中。 这就像我们自己的个人圆周率……
- 配置项目
服务器启动后,有几个重要步骤:
- 您应该更改根密码,默认值为"。
- 必须创建默认包索引
- 您可能需要添加一些"用户"(索引所有者)
- 您可能需要添加一些临时索引。
- 必须将pipl pipe packl上载到defaut包索引 (注意:尚未实现-l o l)
- 创建工作区(可选,有默认工作区) 它是一个知道它属于哪个pipl项目的文件夹。
- 创建工作区 它是工作区内的一个文件夹,包含一个virtualenv,可以编辑 包裹。
- 创建packl
这是一个带有特殊填充的python包,使其更简单,并且可以通过编程控制。
packl可以包含任意python代码,也可以表示a
taks
或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