开发者文档 SDK
响应式状态
带变更追踪的类型化 store,可经平台后端跨运行持久化——后端不可达时静默降级为内存模式。
Python
from allybuild_sdk.reactive import defineStore, getter, action, field
@defineStore("review-queue")
class ReviewQueue:
items: list = field(default_factory=list)
@getter
def pending(self) -> int:
return sum(1 for i in self.items if not i["done"])
@action
def add(self, path: str) -> None:
self.items = self.items + [{"path": path, "done": False}]
queue = ReviewQueue()
queue.add("src/auth.py")TypeScript
import { defineStore } from "@allybuild/sdk";
const useCounter = defineStore("counter", {
state: () => ({ count: 0 }),
getters: { doubled: (s) => s.count * 2 },
actions: { inc() { this.count += 1; } },
});
const counter = useCounter();
counter.inc();美元符号 API
| 方法 | 用途 |
|---|---|
| $patch(dict | fn) | 批量更新,产生一次 "patch" 变更 |
| $reset() | 恢复默认值,发出 "reset" |
| $subscribe(cb) | 监听变更;返回取消订阅函数 |
| $on_action(cb) / $onAction | action 生命周期钩子 |
| $atomic(fn) / $load() | 单事件多字段更新 / 拉取持久化状态 |
| $state | 深拷贝只读快照 |
| $dispose() | 解除订阅并移除 |
命名状态
project_status 为每个命名状态暴露一个响应式 store。按名称访问即可——缺失的名称从状态 schema 播种空 store:
deploy = project_status.get("deploy")
deploy["last_run"] = TASK_IDconst deploy = project_status.get("deploy");
deploy.lastRun = TASK_ID;HTTP 持久化
from allybuild_sdk.reactive import HttpBackend, create_reactive
backend = HttpBackend(
api_url=ALLYBUILD_API_URL,
jwt=TASK_JWT,
project_id=PROJECT_ID,
)
create_reactive(redis=backend)createReactive({
backend: new HttpBackend({
apiUrl: ALLYBUILD_API_URL,
jwt: TASK_JWT,
projectId: PROJECT_ID,
}),
});插件
get_reactive().use(action_logger_plugin) # 记录每次 action 调用
get_reactive().use(persistence_plugin) # 经后端持久化 store 变更错误
- AllyBuildError(status, message)——HTTP 失败
- ReactiveError 基类,派生 InvalidStateKeyError / StoreNotFoundError / StoreDisposedError