Rez 包编写规范指导

SKILL开发

原名 rez-package-authoring

开发 未标注权限 许可证不明确
安装这个技能

讲解编写 Rez 包时的取舍:版本与变体怎么拆、requires 和 commands 怎么写、依赖范围多宽,以及构建发布流程和常见坑。

一句话选型结论

按资料字段整理

Rez 包编写规范指导是开发类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类开发 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_07c3fda9/rez-package-authoring
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

开发
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_07c3fda9仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验2026-11-06上游最后核验时间 · 数据更新 2026-11-06
正文体量11.5 KBSKILL.md 原文大小,越大说明说明书写得越细

能做什么

0 项能力
上游给出的能力概览与适用场景
设计包版本与变体编写依赖声明规避包编写常见坑

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
写代码与改 bug

按需求补代码、定位并修掉报错。

读仓库与生成改动

让模型读懂项目结构,再给出可落地的改动。

跑测试与排查故障

按现象排查问题,补测试用例并复跑。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在开发场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
Rez 包编写规范指导当前 未标注权限 未标注 未标注 未标注 有
技能审查员 浏览器控制 ClawHub 市场 877.9 万 OpenClaw 有
Vercel React 最佳实践 浏览器控制 GitHub 仓库 849.1 万 Codex、Claude、Cursor 有
GitHub 代码协作 联网访问 ClawHub 市场 763.3 万 OpenClaw 有
网页设计指南 联网访问 GitHub 仓库 668.6 万 Codex、Claude、Cursor 有
本体论 只读 ClawHub 市场 663.7 万 OpenClaw 有

SKILL.md 全文

11.5 KB
模型实际读到的说明书原文,来自技能仓库

Rez package authoring rules

> One-sentence summary: package.py is a declaration of what a package needs and provides —
> decide the version/variant split first, then keep requirement ranges as wide as the truth allows
> and as narrow as reality demands.

Skill scope: how to decide and structure a package. For the attribute reference and
@early/@late mechanics see rez-package-definition; for the commands() body and rex API see
rez-package-commands; for build/release command flags see rez-cli; for what rez does to the
module scope of package.py — serialization, build-time freezing and the errors that follow — see
rez-package-pitfalls.

The three decisions, in order

Get these right and the file writes itself.

  1. Is this a new version or a new variant? — something about the package changed vs. something
    about its dependencies changed.
  2. How wide is each dependency range? — what the package genuinely works with, not what it
    happened to be built against.
  3. What is build-time vs. runtime? — which requirements survive into the installed package.

Decision 1 — new version or new variant?

The change Do this
Your own source code changed new version
A dependency version it must build against changed (maya 2016 → 2017, python 2 → 3) new variant
Need to support a second platform/arch/os new variant
Fixing a bug in the payload new version

The rule that catches people out: variants cannot be added to a package that has none without
bumping the version.
A package released with no variants at all can never gain them. So if a
compiled package plausibly needs variants later — a second python, a second DCC — declare the single
variant now:

name = "my_utils"

variants = [
    ["python-2.7"],
]

This is the "future proofing" reason for single-variant packages. The second common reason is
cosmetic but real: variant requirements appear in the install path, so
my_utils/1.0.0/python-2.7/<payload> tells a user what they are getting, where
my_utils/1.0.0/<payload> does not.

Variants are per-version, not per-package. Adding a variant means re-releasing that version; it
does not retroactively change already-released versions.

Decision 2 — how wide should a range be?

Start from the truth about compatibility, then express it with the narrowest syntax that still says
it.

You mean Write
any version foo
any 1.x foo-1
1.0.0 or newer foo-1+
at least 1.2, below 2 foo-1.2+<2
exactly 2.0.0, nothing else foo==2.0.0
1.3 or 5+, but not between foo-1.3\|5+
if present it must be in range, but don't require it ~foo-2.7.3
this version is unacceptable !foo-2015.6

Three rules for sound ranges:

  • Do not pin what you do not have to pin. python==2.7.11 forces every environment that uses
    your package onto that exact build; python-2.7 lets rez co-exist with everything else. Pin only
    when there is a concrete incompatibility.
  • Do not widen past what you tested. A range is a promise. foo-1+ claims you work with every
    future foo-1.
  • Build time can be wider than runtime. This is what requirements expansion is for. A C++ package
    may build against any boost-1 but must link at runtime against the minor version it was built
    with. Write the loose range and let rez expand it:

python requires = [ "boost-1.*", # expands to the version actually built against, e.g. boost-1.55 ]

** expands to the full version (boost-1.** → boost-1.55.1). The equivalent done by hand:

python @early() def requires(): from rez.package_py_utils import expand_requires return expand_requires(["boost-1.*"])

  • Use ~ (weak reference) when you constrain but do not require. DCCs that ship an embedded
    python should declare requires = ["~python-2.7.3"]: python is not pulled into the environment,
    but if something else brings python in, it has to be the compatible one. This is how a studio keeps
    python libraries usable both inside and outside the DCC.

Decision 3 — runtime vs. build time

Attribute Puts into the environment at Transitive?
requires runtime and build yes
build_requires build only yes — collects from every package in the build env
private_build_requires build only no — only from the package being built
variants build (one variant at a time) and runtime (the selected variant) n/a

Choose build_requires when other packages also need the dependency to build against your headers
— a header-only C++ library is the canonical case: if your public headers include its headers, anyone
compiling against you needs it too. Choose private_build_requires for things nobody downstream
needs: doc generators (doxygen, sphinx), build utilities, statically linked libraries.

The build environment is assembled in a fixed order — requires, then transitive build_requires,
then private_build_requires, then the current variant's requirements.

A subtle trap with building: early-bound functions are evaluated more than once per build —
once pre-build, and once per variant — and the pre-build value (where building is False) is
the one baked into the installed package. So to add a requirement at runtime only:

@early()
def requires():
    if building:
        return ["python-2"]
    else:
        return ["runtimeonly-1.2", "python-2"]

Always check the function returns what you want when building is False.

Writing commands()

Rez is not a build system and does not know how your package is consumed. commands() is where you
say it. Keep it declarative — remember it is interpreted into shell code, not executed as Python.

def commands():
    env.PATH.append("{root}/bin")
    env.PYTHONPATH.append("{root}/python")

    if building:
        env.CMAKE_MODULE_PATH.append("{root}/cmake")

Rules:

  • Put build information behind if building: so consumers find headers and CMake config at build
    time without polluting the runtime environment.
  • commands() never runs for the package being built. Use pre_build_commands() for that.
  • Expose tools with tools, not by hand-managing PATH, so rez-context --tools and the tool
    conflict detection work.
  • Keep it cheap. Anything that can be computed once should be an @early() attribute; use
    @late() only for values that genuinely depend on runtime state (env vars, user role).

The build/release loop

rez-build --install                    # build all variants, install to ~/packages
rez-env mypackage                      # resolve and test in a separate shell
rez-test mypackage                     # run the package's tests
rez-release                            # build + release_hooks + VCS plugins + tag

Conventions worth following:

  • Local first, release when ready. rez-build --install goes to local_packages_path
    (typically ~/packages), which sits at the front of packages_path, so your local package shadows
    the released one. That is the intended test loop — and also the reason --no-local exists when a
    local build is masking a released one.
  • Use --prefix to install somewhere else, for example
    rez-build -i --prefix /path/to/repo. rez-release is the managed alternative: it targets
    release_packages_path, runs release_hooks, runs tests, does sanity checks and VCS tagging, and
    adds the release package attributes automatically.
  • Inspect before you build. rez-build --view-pre prints the preprocessed package and exits —
    the fastest way to see what preprocess() and @early() actually produced.
  • Build one variant while iterating: rez-build --variants 0.
  • Pass build-system args after --: rez-build -- -DMYVAR=YES.
  • Do not re-resolve a test shell unnecessarily — if requirements have not changed, the existing
    environment is still valid.

Pitfalls and anti-patterns

Anti-pattern Why it breaks Do instead
foo==1.2.3 on every dependency over-constrains every downstream resolve range it: foo-1.2+<2, pin only real incompatibilities
No variants on a package that will need them variants cannot be added later without a version bump declare one variant now
Non-mutually-exclusive variants, relying on the pick rez cannot compare versions across packages; the choice is a preference, and a transitive dep can overrule it put the discriminator in the request, e.g. rez-env pkg maya
Heavy work in @late() runs at resolve/runtime, on every use compute at build time in @early(), keep @late() for genuine runtime state
Imports at the top of package.py for @late() late functions must import inside the function import inside the function body
Referencing other @early()/@late() attributes from an @early() function raises an error reference plain attributes only, via this
Expecting commands() to run during your own build it never runs for the package being built use pre_build_commands()
Referencing files by relative path in commands() cwd during a build is the build path, not the package root use {root}
Editing a released package in place breaks timestamped resolves and returns stale cached resolves release a new version
Setting env vars for build consumers unconditionally pollutes runtime guard with if building:
Skipping tools and appending to PATH by hand loses tool tracking and conflict detection use the tools attribute

For the ones that produce a rez error rather than a bad decision — top-level imports that make the
installed package.py unparseable, values frozen on the build machine — see
rez-package-pitfalls, which carries the verbatim error text.

Review checklist

Before releasing, check in this order:

  1. Does every range say what the package actually supports — not wider, not narrower?
  2. Does the package need variants now, so it can gain more later without a version bump?
  3. Are build-only dependencies in build_requires / private_build_requires, and is the transitive
    one the right choice?
  4. Does every @early() function return the right value when building is False?
  5. Is build information in commands() guarded by if building:?
  6. Does rez-build --view-pre show the package you intended?
  7. Did rez-test pass before rez-release?

Agent workflow

  1. Read the existing package.py and rez-build --view-pre output before editing anything.
  2. Classify the requested change against decision 1 — version or variant — before touching
    requires.
  3. Widen or narrow each range deliberately; never copy a range from another package without checking
    it means the same thing.
  4. Prefer ~ and ! over hard requirements when you are constraining rather than requiring.
  5. Validate with rez-build --view-pre, then rez-build --install, then rez-env in a separate
    shell — cheapest check first.
  6. Run rez-test before rez-release.

常见问题

5 问
答案由本站依据条目字段整理
Rez 包编写规范指导怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_07c3fda9/rez-package-authoring。安装方式为未标注。装完刷新技能列表或重开客户端。

Rez 包编写规范指导支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

Rez 包编写规范指导权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

Rez 包编写规范指导收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

Rez 包编写规范指导用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 2026-11-06。