@lovrabet/rabetbase-cli 2.5.3-beta.3 → 2.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/api-doc.js +1 -1
- package/lib/api/api-group.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.js +1 -1
- package/lib/api/generate-sdk-config-file.js +1 -1
- package/lib/api/legacy-api-file.js +1 -1
- package/lib/api/model-registry-file.js +1 -1
- package/lib/api/model-registry-scaffold.js +1 -1
- package/lib/api/model-source.js +1 -1
- package/lib/auth/auth-server-ui.js +1 -1
- package/lib/auth/auth-server.js +1 -1
- package/lib/auth/constant.js +1 -1
- package/lib/auth/get-cookie.js +1 -1
- package/lib/auth/get-session-user.js +1 -1
- package/lib/auth/is-session-valid.js +1 -1
- package/lib/auth/login-success-html.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli-flags.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/commands/api/generate.js +1 -1
- package/lib/commands/api/index.js +1 -1
- package/lib/commands/api/list.js +1 -1
- package/lib/commands/api/pull.js +1 -1
- package/lib/commands/api/shared.js +1 -1
- package/lib/commands/app/index.js +1 -1
- package/lib/commands/app/list.js +1 -1
- package/lib/commands/app/members-list.js +1 -1
- package/lib/commands/app/remote-directory.js +1 -1
- package/lib/commands/app/shared.js +1 -1
- package/lib/commands/app-config/delete.js +1 -1
- package/lib/commands/app-config/get.js +1 -1
- package/lib/commands/app-config/index.js +1 -1
- package/lib/commands/app-config/list.js +1 -1
- package/lib/commands/app-config/set.js +1 -1
- package/lib/commands/app-config/shared.js +1 -1
- package/lib/commands/auth/index.js +1 -1
- package/lib/commands/bff/create.js +1 -1
- package/lib/commands/bff/delete.js +1 -1
- package/lib/commands/bff/detail.js +1 -1
- package/lib/commands/bff/index.js +1 -1
- package/lib/commands/bff/list.js +1 -1
- package/lib/commands/bff/logs.js +1 -1
- package/lib/commands/bff/pull.js +1 -1
- package/lib/commands/bff/push.js +1 -1
- package/lib/commands/bff/status.js +1 -1
- package/lib/commands/cli-skill/index.js +1 -1
- package/lib/commands/cli-update.js +1 -1
- package/lib/commands/codegen/index.js +1 -1
- package/lib/commands/codegen/sdk.js +1 -1
- package/lib/commands/codegen/sql.js +1 -1
- package/lib/commands/common/app-registry.js +1 -1
- package/lib/commands/common/app-selector.js +1 -1
- package/lib/commands/common/async-task.js +1 -1
- package/lib/commands/common/dry-run.js +1 -1
- package/lib/commands/common/flags.js +1 -1
- package/lib/commands/common/local-file.js +1 -1
- package/lib/commands/common/validate.js +1 -1
- package/lib/commands/config/delete.js +1 -1
- package/lib/commands/config/get.js +1 -1
- package/lib/commands/config/index.js +1 -1
- package/lib/commands/config/init.js +1 -1
- package/lib/commands/config/list.js +1 -1
- package/lib/commands/config/set.js +1 -1
- package/lib/commands/config/shared.js +1 -1
- package/lib/commands/dataset/batch-design.js +1 -1
- package/lib/commands/dataset/business-group-update.js +1 -1
- package/lib/commands/dataset/business-groups.js +1 -1
- package/lib/commands/dataset/capability.js +1 -1
- package/lib/commands/dataset/cross-relation-create.js +1 -1
- package/lib/commands/dataset/cross-relation-delete.js +1 -1
- package/lib/commands/dataset/cross-relation-list.js +1 -1
- package/lib/commands/dataset/cross-relation-shared.js +1 -1
- package/lib/commands/dataset/cross-relation-update.js +1 -1
- package/lib/commands/dataset/delete.js +1 -1
- package/lib/commands/dataset/detail.js +1 -1
- package/lib/commands/dataset/extend-update.js +1 -1
- package/lib/commands/dataset/field-restore.js +1 -1
- package/lib/commands/dataset/field-update.js +1 -1
- package/lib/commands/dataset/generate.js +1 -1
- package/lib/commands/dataset/index.js +1 -1
- package/lib/commands/dataset/list.js +1 -1
- package/lib/commands/dataset/operations.js +1 -1
- package/lib/commands/dataset/relation-audit.js +1 -1
- package/lib/commands/dataset/relation-create.js +1 -1
- package/lib/commands/dataset/relation-delete.js +1 -1
- package/lib/commands/dataset/relation-shared.js +1 -1
- package/lib/commands/dataset/relation-update.js +1 -1
- package/lib/commands/dataset/relations.js +1 -1
- package/lib/commands/dataset/rename.js +1 -1
- package/lib/commands/dataset/restore.js +1 -1
- package/lib/commands/dataset/user-deleted-field-list.js +1 -1
- package/lib/commands/db/analysis-batching.js +1 -1
- package/lib/commands/db/analyze-batch-plan.js +1 -1
- package/lib/commands/db/analyze-cancel.js +1 -1
- package/lib/commands/db/analyze-start.js +1 -1
- package/lib/commands/db/analyze-status.js +1 -1
- package/lib/commands/db/create.js +1 -1
- package/lib/commands/db/delete.js +1 -1
- package/lib/commands/db/detail.js +1 -1
- package/lib/commands/db/diff-refresh-start.js +1 -1
- package/lib/commands/db/diff-refresh-status.js +1 -1
- package/lib/commands/db/diff.js +1 -1
- package/lib/commands/db/index.js +1 -1
- package/lib/commands/db/list.js +1 -1
- package/lib/commands/db/shared.js +1 -1
- package/lib/commands/db/table-diff-shared.js +1 -1
- package/lib/commands/db/tables.js +1 -1
- package/lib/commands/db/test.js +1 -1
- package/lib/commands/db/update.js +1 -1
- package/lib/commands/deployment/index.js +1 -1
- package/lib/commands/deployment/sync-all.js +1 -1
- package/lib/commands/deployment/sync-jobs.js +1 -1
- package/lib/commands/deployment/sync-status.js +1 -1
- package/lib/commands/doctor.js +1 -1
- package/lib/commands/file/index.js +1 -1
- package/lib/commands/flow/create.js +1 -1
- package/lib/commands/flow/detail.js +1 -1
- package/lib/commands/flow/index.js +1 -1
- package/lib/commands/flow/list.js +1 -1
- package/lib/commands/flow/publish.js +1 -1
- package/lib/commands/flow/runtime-resources-shared.js +1 -1
- package/lib/commands/flow/runtime-role-list.js +1 -1
- package/lib/commands/flow/runtime-role-user-list.js +1 -1
- package/lib/commands/flow/runtime-user-search.js +1 -1
- package/lib/commands/flow/shared.js +1 -1
- package/lib/commands/flow/update.js +1 -1
- package/lib/commands/flow/validate.js +1 -1
- package/lib/commands/instant-api-policy/current.js +1 -1
- package/lib/commands/instant-api-policy/index.js +1 -1
- package/lib/commands/instant-api-policy/init.js +1 -1
- package/lib/commands/instant-api-policy/publish.js +1 -1
- package/lib/commands/instant-api-policy/pull.js +1 -1
- package/lib/commands/instant-api-policy/revision.js +1 -1
- package/lib/commands/instant-api-policy/revisions.js +1 -1
- package/lib/commands/instant-api-policy/rollback.js +1 -1
- package/lib/commands/instant-api-policy/shared.js +1 -1
- package/lib/commands/instant-api-policy/validate.js +1 -1
- package/lib/commands/issue/index.js +1 -1
- package/lib/commands/issue/nudge.js +1 -1
- package/lib/commands/issue/report.js +1 -1
- package/lib/commands/issue/shared.js +1 -1
- package/lib/commands/kb/create.js +1 -1
- package/lib/commands/kb/delete.js +1 -1
- package/lib/commands/kb/detail.js +1 -1
- package/lib/commands/kb/index.js +1 -1
- package/lib/commands/kb/list.js +1 -1
- package/lib/commands/kb/search.js +1 -1
- package/lib/commands/kb/shared.js +1 -1
- package/lib/commands/kb/update.js +1 -1
- package/lib/commands/logs/index.js +1 -1
- package/lib/commands/menu/asset-update.js +1 -1
- package/lib/commands/menu/delete.js +1 -1
- package/lib/commands/menu/external-link-create.js +1 -1
- package/lib/commands/menu/external-link-update.js +1 -1
- package/lib/commands/menu/group-create.js +1 -1
- package/lib/commands/menu/group-update.js +1 -1
- package/lib/commands/menu/index.js +1 -1
- package/lib/commands/menu/list.js +1 -1
- package/lib/commands/menu/move.js +1 -1
- package/lib/commands/menu/regroup-start.js +1 -1
- package/lib/commands/menu/rename.js +1 -1
- package/lib/commands/menu/shared/compare-table.js +1 -1
- package/lib/commands/menu/shared/delete-plan.js +1 -1
- package/lib/commands/menu/shared/facts.js +1 -1
- package/lib/commands/menu/shared/index.js +1 -1
- package/lib/commands/menu/shared/inquirer.js +1 -1
- package/lib/commands/menu/shared/local-pages.js +1 -1
- package/lib/commands/menu/shared/logic.js +1 -1
- package/lib/commands/menu/shared/mutations.js +1 -1
- package/lib/commands/menu/shared/service.js +1 -1
- package/lib/commands/menu/shared/sync-core.js +1 -1
- package/lib/commands/menu/shared/update-core.js +1 -1
- package/lib/commands/menu/shared/valid-url.js +1 -1
- package/lib/commands/menu/sync.js +1 -1
- package/lib/commands/menu/visibility-update.js +1 -1
- package/lib/commands/notification/config-create.js +1 -1
- package/lib/commands/notification/config-delete.js +1 -1
- package/lib/commands/notification/config-list.js +1 -1
- package/lib/commands/notification/config-update.js +1 -1
- package/lib/commands/notification/index.js +1 -1
- package/lib/commands/notification/shared.js +1 -1
- package/lib/commands/ocr/index.js +1 -1
- package/lib/commands/page/create.js +1 -1
- package/lib/commands/page/custom/detail.js +1 -1
- package/lib/commands/page/custom/list.js +1 -1
- package/lib/commands/page/custom/publish.js +1 -1
- package/lib/commands/page/custom/shared.js +1 -1
- package/lib/commands/page/custom/syntax.js +1 -1
- package/lib/commands/page/custom/update.js +1 -1
- package/lib/commands/page/data-list-status.js +1 -1
- package/lib/commands/page/generate-start.js +1 -1
- package/lib/commands/page/generate-status.js +1 -1
- package/lib/commands/page/index.js +1 -1
- package/lib/commands/page/pull.js +1 -1
- package/lib/commands/page/push.js +1 -1
- package/lib/commands/page/relation-audit.js +1 -1
- package/lib/commands/page/restore.js +1 -1
- package/lib/commands/page/shared.js +1 -1
- package/lib/commands/page/sync.js +1 -1
- package/lib/commands/project/api-architecture-upgrade.js +1 -1
- package/lib/commands/project/create/enhanced-guided-create.js +1 -1
- package/lib/commands/project/create/format-elapsed.js +1 -1
- package/lib/commands/project/create/main.js +1 -1
- package/lib/commands/project/create/materialize-project-template.js +1 -1
- package/lib/commands/project/create/project-name.js +1 -1
- package/lib/commands/project/create/project-template-archive.js +1 -1
- package/lib/commands/project/create/project-template-path.js +1 -1
- package/lib/commands/project/create/use-copy-project-template.js +1 -1
- package/lib/commands/project/create/use-format-code.js +1 -1
- package/lib/commands/project/create/use-install-dependencies.js +1 -1
- package/lib/commands/project/domain-routing-sync.js +1 -1
- package/lib/commands/project/index.js +1 -1
- package/lib/commands/project/upgrade.js +1 -1
- package/lib/commands/registry.js +1 -1
- package/lib/commands/role/delete.js +1 -1
- package/lib/commands/role/detail.js +1 -1
- package/lib/commands/role/index.js +1 -1
- package/lib/commands/role/list.js +1 -1
- package/lib/commands/role/shared.js +1 -1
- package/lib/commands/role/update.js +1 -1
- package/lib/commands/role/user-add.js +1 -1
- package/lib/commands/role/user-remove.js +1 -1
- package/lib/commands/role/user-resolve.js +1 -1
- package/lib/commands/rule/get.js +1 -1
- package/lib/commands/rule/index.js +1 -1
- package/lib/commands/rule/list.js +1 -1
- package/lib/commands/rule/set.js +1 -1
- package/lib/commands/rule/shared.js +1 -1
- package/lib/commands/run/index.js +1 -1
- package/lib/commands/schema.js +1 -1
- package/lib/commands/sql/create.js +1 -1
- package/lib/commands/sql/delete.js +1 -1
- package/lib/commands/sql/detail.js +1 -1
- package/lib/commands/sql/exec.js +1 -1
- package/lib/commands/sql/index.js +1 -1
- package/lib/commands/sql/list.js +1 -1
- package/lib/commands/sql/pull.js +1 -1
- package/lib/commands/sql/push.js +1 -1
- package/lib/commands/sql/shared.js +1 -1
- package/lib/commands/sql/status.js +1 -1
- package/lib/commands/sql/validate.js +1 -1
- package/lib/commands/task/index.js +1 -1
- package/lib/commands/task/status.js +1 -1
- package/lib/commands/tenant/index.js +1 -1
- package/lib/commands/tenant/members-list.js +1 -1
- package/lib/commands/tenant/shared.js +1 -1
- package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
- package/lib/commands/user-account/index.js +1 -1
- package/lib/commands/workspace/add.js +1 -1
- package/lib/commands/workspace/index.js +1 -1
- package/lib/commands/workspace/remove.js +1 -1
- package/lib/config/domain-config.js +1 -1
- package/lib/config/project-domain-routing.js +1 -1
- package/lib/config/region-config.js +1 -1
- package/lib/config/schema.js +1 -1
- package/lib/constant/cdn.d.ts +5 -3
- package/lib/constant/cdn.js +1 -1
- package/lib/constant/cli.js +1 -1
- package/lib/constant/defaults.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/constant/output.js +1 -1
- package/lib/constant/paths.js +1 -1
- package/lib/constant/region.js +1 -1
- package/lib/constant/risk.js +1 -1
- package/lib/constant/routing-profile.js +1 -1
- package/lib/context/app-resolver.js +1 -1
- package/lib/context/auth-resolver.js +1 -1
- package/lib/context/config-loader.js +1 -1
- package/lib/context.js +1 -1
- package/lib/core/alias-resolver.js +1 -1
- package/lib/core/api-client.js +1 -1
- package/lib/core/bff/config.js +1 -1
- package/lib/core/bff/file-system.js +1 -1
- package/lib/core/bff/hash.js +1 -1
- package/lib/core/bff/hook-directory.js +1 -1
- package/lib/core/bff/lock.js +1 -1
- package/lib/core/bff/utils.js +1 -1
- package/lib/core/cross-db-relation.js +1 -1
- package/lib/core/db-resolver.js +1 -1
- package/lib/core/flow-config.js +1 -1
- package/lib/core/instant-api-policy/config.js +1 -1
- package/lib/core/kb-search-client.js +1 -1
- package/lib/core/page/file-system.js +1 -1
- package/lib/core/page/hash.js +1 -1
- package/lib/core/page/lock.js +1 -1
- package/lib/core/page/lr-smart-jsx.js +1 -1
- package/lib/core/sql-index-auditor.js +1 -1
- package/lib/core/sql-sync/config.js +1 -1
- package/lib/core/sql-sync/file-system.js +1 -1
- package/lib/core/sql-sync/hash.js +1 -1
- package/lib/core/sql-sync/lock.js +1 -1
- package/lib/core/sql-sync/utils.js +1 -1
- package/lib/core/sql-validator.js +1 -1
- package/lib/errors.js +1 -1
- package/lib/framework/build-all-flags.js +1 -1
- package/lib/framework/error-output.js +1 -1
- package/lib/framework/explicit-yes.js +1 -1
- package/lib/framework/flags.js +1 -1
- package/lib/framework/help.js +1 -1
- package/lib/framework/index.js +1 -1
- package/lib/framework/output.js +1 -1
- package/lib/framework/response.js +1 -1
- package/lib/framework/runner-alias.js +1 -1
- package/lib/framework/runner.js +1 -1
- package/lib/framework/schema-export.js +1 -1
- package/lib/framework/supported-flags.js +1 -1
- package/lib/framework/types.js +1 -1
- package/lib/generated/build-info.d.ts +4 -4
- package/lib/generated/build-info.js +1 -1
- package/lib/generated/official-routing.js +1 -1
- package/lib/generated/routing-contract.js +1 -1
- package/lib/help.js +1 -1
- package/lib/postinstall.js +1 -1
- package/lib/runtime/confirmation.js +1 -1
- package/lib/runtime/event.js +1 -1
- package/lib/runtime/index.js +1 -1
- package/lib/runtime/queue.js +1 -1
- package/lib/runtime/resolve.js +1 -1
- package/lib/skills/builtin-skill.js +1 -1
- package/lib/skills/main.js +1 -1
- package/lib/skills/npx-skills-add.js +1 -1
- package/lib/skills/skill-presence.js +1 -1
- package/lib/telemetry/cli-command-trace.js +1 -1
- package/lib/telemetry/cli-help-trace.js +1 -1
- package/lib/telemetry/ensure-cli-otel-config.js +1 -1
- package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
- package/lib/telemetry/send-cli-trace-log.js +1 -1
- package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
- package/lib/utils/ai_config.js +1 -1
- package/lib/utils/apply-jq-filter.js +1 -1
- package/lib/utils/cdn-config.js +1 -1
- package/lib/utils/check-sdk-version.js +1 -1
- package/lib/utils/cli-version-check.js +1 -1
- package/lib/utils/cli-version-policy.d.ts +7 -0
- package/lib/utils/cli-version-policy.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/entity-with-id.js +1 -1
- package/lib/utils/file-utils.js +1 -1
- package/lib/utils/guides-cdn.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/is-non-interactive.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/platform.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/lib/utils/update-notice.js +1 -1
- package/lib/utils/version.js +1 -1
- package/lib/utils/with-active-cookie.js +1 -1
- package/lib/utils/write-cli-side-channel.js +1 -1
- package/package.json +3 -1
- package/skills/rabetbase/SKILL.md +7 -5
- package/skills/rabetbase/guides/backend-function.md +5 -1
- package/skills/rabetbase/guides/bff-creation-workflow.md +3 -1
- package/skills/rabetbase/guides/cross-database-bff.md +70 -0
- package/skills/rabetbase/guides/data-api-guidelines.md +35 -33
- package/skills/rabetbase/guides/sql-creation-workflow.md +2 -0
- package/skills/rabetbase/references/rabetbase-dataset-cross-relations.md +5 -1
- package/skills/rabetbase.manifest.json +4 -3
- package/templates/README.md +41 -13
|
@@ -830,6 +830,8 @@ rabetbase notification config-list --type EMAIL --format compress
|
|
|
830
830
|
|
|
831
831
|
## 事务规则
|
|
832
832
|
|
|
833
|
+
事务原子性只适用于已核验的运行时事务范围。跨连接模型操作或外部 API 不因位于同一个回调就成为原子操作;分库读取也不能假定共享一致性快照。涉及这些场景时,按 [跨库 BFF 查询与拼接](cross-database-bff.md)确认授权、一致性与写入边界。
|
|
834
|
+
|
|
833
835
|
事务使用方式:
|
|
834
836
|
|
|
835
837
|
```javascript
|
|
@@ -860,6 +862,8 @@ await context.client.db.transaction(async (tx) => {
|
|
|
860
862
|
|
|
861
863
|
编写 Backend Function 前,必须阅读 `data-api-guidelines.md` 中的性能优化部分。
|
|
862
864
|
|
|
865
|
+
跨库关联须先区分展示补充与参与筛选、排序、统计的关联,执行顺序见 [跨库 BFF 查询与拼接](cross-database-bff.md)。批量调用仍需处理分页完整性和重复匹配;不能用单次 `$in` 或当前页拼接代替完整结果。
|
|
866
|
+
|
|
863
867
|
重点避免:
|
|
864
868
|
|
|
865
869
|
* 循环查询单条
|
|
@@ -868,7 +872,7 @@ await context.client.db.transaction(async (tx) => {
|
|
|
868
872
|
|
|
869
873
|
性能要求:
|
|
870
874
|
|
|
871
|
-
*
|
|
875
|
+
* 按接口限制与业务预算设定调用次数、读取量和超时上限;超限时明确报告,不能截断并冒充完整结果
|
|
872
876
|
* 可批量查询时,用 `filter + $in`
|
|
873
877
|
* 同一数据集批量新增优先使用 `batchCreate()`;相同字段值的批量更新优先使用 `update({ id: [...] })`
|
|
874
878
|
* 只有 Instant API 无法表达的复杂写入才考虑已有且契约可信的 Custom SQL
|
|
@@ -41,7 +41,9 @@ rabetbase dataset detail --code <数据集编码> --format compress \
|
|
|
41
41
|
写入前必须确认:
|
|
42
42
|
* 业务必填字段:`data.fields[].required === true`,平台自动维护字段除外
|
|
43
43
|
* 枚举/选择字段:写入 `options[].value`,不要写展示用 `label`
|
|
44
|
-
*
|
|
44
|
+
* 外键字段:同库关系从 `data.relations[]` 或 `dataset relations` 确认;跨库关系使用 `dataset cross-relation-list`,不能用同库关系列表代替
|
|
45
|
+
|
|
46
|
+
涉及跨连接读取或拼接时,先读 [跨库 BFF 查询与拼接](cross-database-bff.md),确认完整键、基数、目标字段用途、各端授权和读取预算。业务关系说明与平台登记事实分别核对;冲突时报告差异,不能自动采用平台关系。复合键不能拆成独立的单字段 Relation。
|
|
45
47
|
|
|
46
48
|
### 3. 查平台(按需)
|
|
47
49
|
* 新建 → 跳过
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# 跨库 Backend Function 查询与拼接
|
|
2
|
+
|
|
3
|
+
用于编写或审查跨数据库连接的 BFF 查询:分别读取各数据源,在可信 BFF 中按完整关联键拼接,再输出业务结果。单表优先使用 InstantAPI;同一连接内的关联或聚合可使用已确认支持的关联查询或 Custom SQL。跨库 Relation 描述逻辑关联,不赋予自动 JOIN、访问授权或分布式事务能力。
|
|
4
|
+
|
|
5
|
+
本文同库/跨库按平台数据库连接区分;不同 dblink 不因库名或表名相同而视为同库。默认关联关系指同库关联关系。
|
|
6
|
+
|
|
7
|
+
## 先确认事实和业务合同
|
|
8
|
+
|
|
9
|
+
1. 用 `rabetbase dataset detail --code <datasetCode> --format compress` 核对两端字段、类型、物理表和连接;模型访问方式遵循 [Backend Function](backend-function.md),同名表必须消歧。连接身份以当前应用的真实 dblink 为准,不靠库名或表名推断。
|
|
10
|
+
2. 用 [跨库关系命令](../references/rabetbase-dataset-cross-relations.md)的 `cross-relation-list` 查询平台已登记关系。业务文档中的关系说明不代表已经登记;平台配置也不能代替业务正确性确认。两者冲突时报告端点差异,由业务确认后再维护关系,不能自动照搬或修正。
|
|
11
|
+
3. 在业务项目明确:完整关联键及顺序、基数、允许缺失与否、目标字段用途(展示、筛选、排序、统计)、各端访问范围、返回字段,以及读取预算和失败处理。具体映射留在业务项目,详细元数据按需查询;不在通用 Skill 中保存项目关系清单或元数据快照。
|
|
12
|
+
|
|
13
|
+
依据按需查找:先读已有接口文档和当前元数据,确认调用能力与硬限制;再读项目业务合同和现有配置,确定关联语义、授权及读取预算。已有事实充分时直接采用,不重复要求用户确认。依据冲突或缺少影响正确性、授权、完整性的必要信息时,说明具体缺口后确认;不自行发明权限字段、运行时上限或项目级配置。
|
|
14
|
+
|
|
15
|
+
当前 `cross-relation-create/update/delete` 每端只接收一个字段。复合键必须作为有序字段组整体理解,不能拆成多条单字段 Relation,也不能用逗号拼接字段来冒充复合关系支持。BFF 可依据已确认的业务合同实现完整键匹配,但不得宣称该复合关系已由这些命令登记。
|
|
16
|
+
|
|
17
|
+
## 根据查询语义选择执行顺序
|
|
18
|
+
|
|
19
|
+
| 外表的用途 | 执行方式 | 结果要求 |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| 仅补充展示字段 | 先对已授权主表筛选、稳定排序、计数和分页,再批量读取当前页所需外表数据 | 保留主记录、主表顺序和总数;一对多用约定的集合承载,不能展开后仍沿用原分页含义 |
|
|
22
|
+
| 参与筛选 | 先分析完整筛选表达式;能够等价转成目标键条件时,在预算内完整取得所需键集合,再保留原布尔逻辑筛选、计数和分页主表 | 主表 total 对应最终筛选结果;不能等价表达时报告能力边界 |
|
|
23
|
+
| 参与排序或统计 | 先确认能够覆盖完整相关结果集的执行方案 | 当前页拼接后的排序或统计不能冒充全局结果;预算不足时请求调整范围或由权威查询服务承接 |
|
|
24
|
+
|
|
25
|
+
正向匹配可在确认等价后使用引用键 `IN` 条件。否定、无关联、空引用,以及主表条件与外表条件混合的 `OR` 必须分别保留语义,不能统一改成正向 `IN`。例如“主记录紧急 OR 目标启用”转换后仍须保留主记录紧急分支;“没有关联目标”不能用任意目标字段筛选的补集代替。授权过滤始终限制整个结果集,不能被业务 `OR` 绕过。
|
|
26
|
+
|
|
27
|
+
不同连接分别读取,不用跨库 SQL JOIN、跨库子查询或视图绕过执行边界,也不把整个外库拉进 BFF。关系存在和 `sql validate` 通过都不能证明跨连接查询可执行。各库支持的过滤、投影、聚合可在所属库内完成;没有可验证的完整方案时停止,不能返回貌似完整的部分结果。
|
|
28
|
+
|
|
29
|
+
## 完整键、批量读取与拼接
|
|
30
|
+
|
|
31
|
+
以下步骤描述为已选定主记录补充展示字段的流程。参与筛选、排序或统计时先按上表确定读取顺序,再复用完整键与批量处理规则;不能把主表先分页当作所有跨库查询的前置步骤。
|
|
32
|
+
|
|
33
|
+
1. 从已授权主记录提取有效引用键。空值定义遵循字段合同,不用真值过滤误删合法的 `0`;复合键任一必需部分缺失时按缺失关系处理。
|
|
34
|
+
2. 保留 ID 精度及类型语义,不把大整数 ID 转成 `Number`。只有两端合同明确同一标识的不同编码方式时才做无损归一化;不擅自忽略大小写、前导零或空白。
|
|
35
|
+
3. 对完整键去重并按字段值比较。复合键保留字段顺序和类型,使用嵌套 `Map` 或明确的无损键编码,避免分隔符拼接碰撞;不能直接用新建数组作为 `Map` 查询键,因为数组按对象身份而非内容比较。例如期望 `(A, 7)`、`(B, 9)` 时,`region IN (A,B) AND external_id IN (7,9)` 会额外选中 `(A,9)`、`(B,7)`;应使用配对条件,或按第一个键分组后查询对应第二键集合,最终仍按完整键匹配。更多字段同样逐一配对,不省略剩余字段;示例字段不替代真实字段合同。
|
|
36
|
+
4. 键集合为空时跳过外表查询。非空时按目标接口的参数、分页和数量限制分批查询,投影只包含拼接和已授权输出所需字段。分批大小、最大页数、总读取量、并发和超时依据接口合同及业务预算确定,不复制其他项目的固定数值。
|
|
37
|
+
5. 每批都按该接口的分页合同读取完整结果,再建立映射。已知仍有后续结果却只拿到一页、完成前达到预算上限、页码不推进或查询失败时,默认返回错误,不推断剩余键均不存在。分批循环用于有界读取,不退回逐条记录的 N+1 调用。
|
|
38
|
+
6. 按已确认基数组装。1:1 或 N:1 的同一完整目标键出现多条记录时,报告重复匹配,不能用 `Map.set`、`Object.fromEntries` 或“取第一条”静默覆盖。一对多或多对多按合同保留集合,输出顺序须明确。
|
|
39
|
+
|
|
40
|
+
区分以下结果,不用 `catch(() => [])` 将错误伪装为空数据:
|
|
41
|
+
|
|
42
|
+
默认接口成功表示所需数据已完整读取。只有已有接口合同明确支持部分结果时,才使用其既定状态与字段输出;不能临时新增 `partial` 字段就返回成功,也不能把未完成计算的 `total`、排序或统计描述为准确结果。
|
|
43
|
+
|
|
44
|
+
| 情况 | 处理 |
|
|
45
|
+
|---|---|
|
|
46
|
+
| 完整查询成功,允许缺失的展示关系未匹配 | 保留主记录;单目标返回 `null`,多目标集合按业务合同返回 |
|
|
47
|
+
| 必需关系缺失或唯一关系重复匹配 | 按业务合同返回错误;不猜测替代记录 |
|
|
48
|
+
| 权限不足或查询失败 | 返回错误,不能解释为“目标不存在” |
|
|
49
|
+
| 分页结果不完整 | 默认返回错误;已有部分结果合同按上文处理,不能推断未读结果 |
|
|
50
|
+
|
|
51
|
+
## 授权与数据所有权
|
|
52
|
+
|
|
53
|
+
- BFF 从可信身份或已核验的服务端访问上下文确定权限。客户端提供的业务筛选值不能扩大授权范围;子记录需要沿已确认的父关系核验归属。
|
|
54
|
+
- 每个数据源分别落实访问控制。不能把主库的租户字段、门店字段、软删除字段或状态枚举机械套到目标表;关联键本身不是访问凭证,已取得的目标 ID 也不等于有权读取它。
|
|
55
|
+
- 核对 BFF 内部模型、SQL 或外部 API 的实际调用通道,不假设它必然经过 Dataset HTTP Hook。缺少授权合同则停止;复用公共授权函数前确认其输入、可信上下文和覆盖范围。
|
|
56
|
+
- 查询投影和返回值使用已授权字段白名单,敏感字段不得通过拼接结果、错误、日志或参数回显泄漏。保留业务字段的精度和空值语义,不为展示默认补零或改变标识符类型。
|
|
57
|
+
- 读写通道由数据所有权和接口合同决定。某个项目的外库只读、指定 OpenAPI 写入规则不能推广为所有外库的统一策略;确认关系或具备读取能力均不构成写入授权。
|
|
58
|
+
|
|
59
|
+
## 一致性与写入边界
|
|
60
|
+
|
|
61
|
+
分库读取不共享已证明的一致性快照。数据可能在两次读取之间变化;拼接结果不能作为库存、结算等关键写入的最终依据,关键校验应由权威写入服务在其一致性边界内完成。
|
|
62
|
+
|
|
63
|
+
`context.client.db.transaction` 的原子性仅按已核验的运行时事务范围理解,不能通过把调用放进同一个回调就承诺跨连接或外部 API 原子性。涉及多系统写入时先明确操作顺序、幂等、部分成功与补偿合同;状态未知时先核对,不盲目重试或自动补偿。事务 API 用法见 [Backend Function 事务规则](backend-function.md#事务规则)。
|
|
64
|
+
|
|
65
|
+
## 交付检查
|
|
66
|
+
|
|
67
|
+
- 两端连接、完整键、基数、权限、投影和读取预算都有明确依据;历史关系和同名字段没有被自动当成有效关系。
|
|
68
|
+
- 覆盖空键、复合键交叉组合与按值查找、重复匹配、允许/必需关系缺失、多页结果、读取中断及预算不足。
|
|
69
|
+
- 展示补充保留主表分页含义;关联筛选包含正向、否定、无关联和混合 OR 的反例,全局排序和统计不会用当前页结果替代完整结果。
|
|
70
|
+
- 用不同身份验证各端数据范围和字段输出;需要真实业务行数据或 BFF 执行验证时,按 [BFF 工作流](bff-creation-workflow.md)显式交接运行态验证。关系配置回读和 `bff push` 成功不能替代该验证。
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
| **分析主外键关系** | 理解表间关联,正确处理下拉框数据 |
|
|
15
15
|
| **使用真实接口** | 不使用 mock 数据,直接调用数据集接口 |
|
|
16
16
|
| **避免循环访问** | 批量查询替代循环单个查询 |
|
|
17
|
-
|
|
|
17
|
+
| **有界读取** | 按接口限制与业务预算设定调用和读取上限;超限不能截断结果并冒充完整数据 |
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
**CLI 信封、`data.*` 键位、平台 `get-driven-data` 与 CLI 归一化对照**:单一权威见 [`references/rabetbase-dataset-detail.md`](../references/rabetbase-dataset-detail.md)。
|
|
33
33
|
|
|
34
|
-
**不要复制示例字段名。**
|
|
34
|
+
**不要复制示例字段名。** 本指南里的表名、字段名、枚举值只用于说明形态;真实代码的字段与连接事实来自当前项目的 `rabetbase dataset detail` 输出。同库关系读取 `data.relations[]`,跨库登记事实单独使用 `dataset cross-relation-list` 核对。
|
|
35
35
|
|
|
36
36
|
---
|
|
37
37
|
|
|
@@ -56,7 +56,10 @@
|
|
|
56
56
|
| 聚合列名 | `aggregate[].column` | SDK aggregate 定义使用 `column`,不要写旧别名 `field` |
|
|
57
57
|
| 必填字段 | `data.fields[].required` | `true` 表示创建/写入时需处理,平台自动维护字段除外 |
|
|
58
58
|
| 枚举/选择值 | `data.fields[].options[].value` | 写入持久化 `value`,不要写展示用的 `label` |
|
|
59
|
-
|
|
|
59
|
+
| 同库关系 | `data.relations[]` / `dataset relations` | 确认端点、基数和查询能力,不按同名字段推断关系 |
|
|
60
|
+
| 跨库登记关系 | `dataset cross-relation-list` | 与业务合同分别核对,不用同库关系列表替代 |
|
|
61
|
+
|
|
62
|
+
复合键 BFF 可依据已确认的业务合同和两端字段事实实现,不要求先拆成单字段 Relation;平台登记关系不等于执行能力。完整键、查询顺序和授权边界见 [跨库 BFF 查询与拼接](cross-database-bff.md)。
|
|
60
63
|
|
|
61
64
|
常用投影:
|
|
62
65
|
|
|
@@ -271,7 +274,7 @@ const result = await models[TABLES.primary].filter({
|
|
|
271
274
|
|
|
272
275
|
### 场景识别
|
|
273
276
|
|
|
274
|
-
|
|
277
|
+
代码中出现**按主记录逐条调用接口的 N+1 查询**时,必须优化;按接口合同执行的有界分批和分页循环属于批量读取:
|
|
275
278
|
|
|
276
279
|
```tsx
|
|
277
280
|
// ❌ 性能灾难:N 次接口调用
|
|
@@ -283,22 +286,22 @@ for (const row of rows) {
|
|
|
283
286
|
### 优化方案选择
|
|
284
287
|
|
|
285
288
|
```
|
|
286
|
-
|
|
289
|
+
循环逐条访问接口(N 次调用)
|
|
290
|
+
│
|
|
291
|
+
├─ 不同数据库连接 → BFF 分库批量读取,按完整键拼接
|
|
287
292
|
│
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
│ │ 一次查询,自动 JOIN
|
|
292
|
-
│ │
|
|
293
|
-
│ └─ 否 → 使用批量查询($in)
|
|
294
|
-
│ 一次查询,手动映射
|
|
293
|
+
└─ 同一连接
|
|
294
|
+
├─ 1:1/N:1 且已确认支持关联查询 → filter 多表关联查询
|
|
295
|
+
└─ 其他场景 → 有界批量查询,或已确认支持的库内 Custom SQL
|
|
295
296
|
```
|
|
296
297
|
|
|
298
|
+
先核对数据源及查询能力,再选择方案;基数或平台存在 Relation 不能单独证明可自动 JOIN。跨库场景必须阅读 [跨库 BFF 查询与拼接](cross-database-bff.md),分别处理展示补充、关联筛选、全局排序和统计。
|
|
299
|
+
|
|
297
300
|
### 方案 1:多表关联查询(推荐)
|
|
298
301
|
|
|
299
302
|
<span style={{fontSize: '0.9em', color: '#888'}}>v1.2.0+</span>
|
|
300
303
|
|
|
301
|
-
|
|
304
|
+
**适用于**:同一数据库连接内、已确认支持关联查询的 1:1 或 N:1 关系(主记录→关联记录、成员→组织等)。以下示例不能用于推断跨连接 JOIN 能力。
|
|
302
305
|
|
|
303
306
|
```tsx
|
|
304
307
|
// ✅ 一次查询,自动 JOIN
|
|
@@ -319,28 +322,27 @@ const result = await client.models.primary.filter({
|
|
|
319
322
|
|
|
320
323
|
### 方案 2:批量查询
|
|
321
324
|
|
|
322
|
-
|
|
325
|
+
**适用于**:不支持多表关联或需要分开读取时;跨库拼接在可信 BFF 中完成。
|
|
323
326
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
);
|
|
334
|
-
rows.forEach(row => row.relatedName = relatedMap[row.related_id]);
|
|
335
|
-
```
|
|
327
|
+
以下步骤用于向已选定主记录补充展示字段。外表参与筛选、排序或统计时,先按 [跨库 BFF 查询与拼接](cross-database-bff.md)确定完整查询顺序,不能先取主表当前页后套用本流程。
|
|
328
|
+
|
|
329
|
+
1. 从已授权主记录提取有效完整键并去重;空键集合跳过查询,合法的 `0` 不用真值过滤排除。
|
|
330
|
+
2. 单字段键可用 `$in` 批量过滤;复合键保留字段配对,不能用两个独立 `$in` 替代联合条件。
|
|
331
|
+
3. 按目标接口限制分批并读取所有匹配页,只取拼接和输出必需的已授权字段。批量查询不保证一次调用返回完整数据;结果不完整或请求失败时默认返回错误。部分结果只按已有接口合同输出,规则见 [跨库 BFF 查询与拼接](cross-database-bff.md)。
|
|
332
|
+
4. 完整结果按完整键和基数组装;单目标关系出现重复键时报告冲突,一对多按合同收集为集合,不能静默覆盖。
|
|
333
|
+
5. 只有完整查询成功才判断未匹配;允许缺失的单目标展示关系保留主记录并返回 `null`,必需关系缺失按业务合同失败。
|
|
334
|
+
|
|
335
|
+
具体执行顺序、复合键示例与失败语义见 [跨库 BFF 查询与拼接](cross-database-bff.md)。
|
|
336
336
|
|
|
337
337
|
### 性能对比
|
|
338
338
|
|
|
339
|
-
| 方案 |
|
|
340
|
-
|
|
341
|
-
|
|
|
342
|
-
|
|
|
343
|
-
| 批量查询 |
|
|
339
|
+
| 方案 | 调用量取决于 | 使用前提 |
|
|
340
|
+
|------|-------------|----------|
|
|
341
|
+
| 循环单条 | 主记录数量 | 容易产生 N+1,应优先批量化 |
|
|
342
|
+
| 库内关联 | 接口分页与查询计划 | 同连接且查询能力已确认 |
|
|
343
|
+
| 批量查询 | 去重键数量、批次和匹配结果页数 | 完整读取并在预算内组装 |
|
|
344
|
+
|
|
345
|
+
调用次数不能直接换算为固定耗时;按真实查询计划、数据量和接口限制验证。
|
|
344
346
|
|
|
345
347
|
---
|
|
346
348
|
|
|
@@ -381,7 +383,7 @@ await context.client.sql.execute({
|
|
|
381
383
|
- [ ] **外键字段已识别**:下拉框数据来自关联数据集接口
|
|
382
384
|
- [ ] **枚举字段已处理**:展示使用 `options[].label`,写入使用 `options[].value`
|
|
383
385
|
- [ ] **未使用 mock 数据**:所有下拉框数据来自真实接口
|
|
384
|
-
- [ ]
|
|
386
|
+
- [ ] **避免 N+1**:同连接且能力已确认时使用多表关联;跨连接交由 BFF 有界批量读取
|
|
385
387
|
- [ ] **字段名正确**:使用 `data.fields[].name`(列名),区分大小写,与数据集定义一致
|
|
386
388
|
- [ ] **系统字段已识别**:结合 `data.dbtable` 与 `backend-function.md`,创建/更新时间等按平台约定不传
|
|
387
389
|
- [ ] **关联表使用表名**:多表关联时使用 `tableName.fieldName` 格式
|
|
@@ -394,7 +396,7 @@ await context.client.sql.execute({
|
|
|
394
396
|
- [ ] **枚举字段写入正确**:写入 `options[].value`,不是展示 `label`
|
|
395
397
|
- [ ] **外键校验已处理**:创建/更新前校验外键有效性
|
|
396
398
|
- [ ] **系统字段未设置**:主键自增、系统时间等按平台约定不手工传入,详见 `backend-function.md`
|
|
397
|
-
- [ ]
|
|
399
|
+
- [ ] **批量读取完整**:按完整键去重、分批和分页;查询失败、不完整或唯一关系重复匹配均明确报告
|
|
398
400
|
- [ ] **批量操作已优化**:大量数据操作使用自定义 SQL
|
|
399
401
|
|
|
400
402
|
### SQL 开发
|
|
@@ -27,6 +27,8 @@ SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-myba
|
|
|
27
27
|
### 3. 校验字段
|
|
28
28
|
执行 `rabetbase dataset detail --code <数据集编码> --format json` 确认表名、字段名、字段类型。禁止凭经验猜。
|
|
29
29
|
|
|
30
|
+
同时核对各表所属连接与该 SQL 的执行连接;同名表须按真实连接消歧。不同连接的逻辑关联由 [跨库 BFF 查询与拼接](cross-database-bff.md)编排分库读取,不能用跨库 JOIN、子查询或视图绕过边界。`sql validate` 的静态检查不证明跨连接可执行、权限完整或全局结果正确。
|
|
31
|
+
|
|
30
32
|
### 4. 先把 SQL 拉/落到同步目录
|
|
31
33
|
|
|
32
34
|
#### 修改已有 SQL
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# 跨库数据集关系
|
|
2
2
|
|
|
3
|
-
使用 `dataset cross-relation-list/create/update/delete` 管理同一应用内、不同数据库连接的 DB_TABLE
|
|
3
|
+
使用 `dataset cross-relation-list/create/update/delete` 管理同一应用内、不同数据库连接的 DB_TABLE 逻辑关联。同库关系命令见 [数据集关系](rabetbase-dataset-relation-mutations.md)。跨库关系事实使用本页的 list 查询,不能用同库关系查询命令 `dataset relations` 或 `dataset detail` 的关系列表替代回读。
|
|
4
|
+
|
|
5
|
+
需要实现跨库业务查询时,读取 [跨库 BFF 查询与拼接](../guides/cross-database-bff.md),按目标字段用途确定查询顺序,并核对各端授权及结果完整性。业务关系清单不代表平台已登记;平台已有关系也需要与业务合同核对。
|
|
4
6
|
|
|
5
7
|
## 定位和查询
|
|
6
8
|
|
|
@@ -27,6 +29,8 @@ rabetbase dataset cross-relation-create \
|
|
|
27
29
|
|
|
28
30
|
两端数据集与字段必填。`--to-label-column` 可选,省略时默认目标关联字段;`--cardinality` 可选,省略时不设置。合法基数:`ONE_TO_ONE`、`ONE_TO_MANY`、`MANY_TO_ONE`、`MANY_TO_MANY`。
|
|
29
31
|
|
|
32
|
+
每端只接收一个字段;复合键不能拆成多条单字段关系,也不能用逗号拼接字段传入。依据完整复合键编写 BFF 不代表这些命令已经登记该关系。
|
|
33
|
+
|
|
30
34
|
完全相同的端点不可重复创建。同一源字段可以关联不同目标;需要在创建前理解下述更新、删除的唯一匹配要求。
|
|
31
35
|
|
|
32
36
|
## 更新
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"name": "rabetbase",
|
|
4
4
|
"packageName": "@lovrabet/rabetbase-cli",
|
|
5
|
-
"packageVersion": "2.5.3
|
|
6
|
-
"skillVersion": "2.5.3
|
|
5
|
+
"packageVersion": "2.5.3",
|
|
6
|
+
"skillVersion": "2.5.3",
|
|
7
7
|
"files": [
|
|
8
8
|
"SKILL.md",
|
|
9
9
|
"guides/approval-flow-development-workflow.md",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"guides/best-practices.md",
|
|
12
12
|
"guides/bff-creation-workflow.md",
|
|
13
13
|
"guides/conflict-detection.md",
|
|
14
|
+
"guides/cross-database-bff.md",
|
|
14
15
|
"guides/custom-page-workflow.md",
|
|
15
16
|
"guides/data-api-guidelines.md",
|
|
16
17
|
"guides/database-connection-workflow.md",
|
|
@@ -147,5 +148,5 @@
|
|
|
147
148
|
"references/rabetbase-user-account.md",
|
|
148
149
|
"references/rabetbase-workspace.md"
|
|
149
150
|
],
|
|
150
|
-
"digest": "
|
|
151
|
+
"digest": "f2eb4c395b42ec83d9d10674a574182cc89015378268bb10bf3dd875441f1928"
|
|
151
152
|
}
|
package/templates/README.md
CHANGED
|
@@ -49,27 +49,55 @@ node lib/cli.js project create template-verify --template-source templates/proje
|
|
|
49
49
|
使用尚未发布的 CLI 时,先执行 `npm run build:dev`;
|
|
50
50
|
使用已安装版本时,可把第二条命令换成 `rabetbase project create ...`。
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
模板源码确认后,可在开发阶段为单个通道生成快照;正式发布由 release 事务使用
|
|
53
|
+
`deploy:verify` 已解析的精确版本自动生成,不要求开发者提前修改 `package.json#version`。
|
|
53
54
|
|
|
54
55
|
```bash
|
|
55
|
-
#
|
|
56
|
-
npm run sync:cdn
|
|
56
|
+
# 开发阶段:更新顶层 projectTemplate 与正式本地快照
|
|
57
|
+
npm run sync:cdn -- --version <stable-version>
|
|
57
58
|
|
|
58
|
-
# beta
|
|
59
|
-
npm run sync:cdn:beta
|
|
59
|
+
# 开发阶段:只更新 beta.projectTemplate 与 beta 本地快照
|
|
60
|
+
npm run sync:cdn:beta -- --version <beta-version>
|
|
61
|
+
|
|
62
|
+
# 上传前组装:校验仓内两个快照并原子生成完整 dist 目录,不推进任一通道
|
|
63
|
+
npm run sync:cdn:all
|
|
60
64
|
|
|
61
65
|
# 只读校验:发布门禁会按目标自动执行其中一条
|
|
62
66
|
npm run check:cdn
|
|
63
67
|
npm run check:cdn:beta
|
|
68
|
+
npm run check:cdn:all
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`sync:cdn` 与 `sync:cdn:beta` 从同一个模板真源重新生成所选通道;写入快照必须显式提供候选
|
|
72
|
+
版本,正式与 beta 快照可以不同,两个命令都不会推进另一通道。发布门禁通过
|
|
73
|
+
`--version <resolved-version>` 只读验证将要发布的
|
|
74
|
+
描述,release 事务再使用同一版本落盘。`sync:cdn:all` 只验证仓内已有快照并组装完整 `dist/`。
|
|
75
|
+
唯一配置索引写入
|
|
76
|
+
`dist/rabetbase-cli/config/index.json`,并覆盖发布到
|
|
77
|
+
`https://g.lovrabet.com/dist/rabetbase-cli/config/index.json`。正式模板使用顶层
|
|
78
|
+
`projectTemplate`,beta 模板使用 `beta.projectTemplate`。仓内正式文件
|
|
79
|
+
`sub-app-react-demo.zip` 与 beta 文件 `sub-app-react-demo-beta.zip` 只是固定本地快照名;远端新发布
|
|
80
|
+
文件统一为 `sub-app-react-demo-<version>.zip`。beta 描述缺失时继续兼容读取顶层正式模板。
|
|
81
|
+
每个模板描述包含 CLI `version`、文件 `name`、从 `/dist/...` 开始的完整相对 `url`、`sha256`
|
|
82
|
+
和 `size`;`name` 与 `url` 指向同一版本化文件,旧 CLI 按 `name`、新版 CLI 按 `url` 下载并
|
|
83
|
+
校验大小与摘要。线上已有固定文件名描述继续兼容读取。CLI 使用
|
|
84
|
+
当前国家/地区或独立部署路由中的 `cdn.lovrabet` 作为 host。CLI 更新策略与项目模板共用这个
|
|
85
|
+
固定配置索引,beta 同步只更新 `beta.projectTemplate`。
|
|
86
|
+
`check:cdn` / `check:cdn:beta` 在系统临时目录重建 ZIP,只读比对所选通道的描述、当前 CLI 版本
|
|
87
|
+
和仓内归档;`check:cdn:all` 只检查两个已提交快照各自自洽。三者都不会改动 `cdn/` 或 `dist/`。
|
|
88
|
+
|
|
89
|
+
生成目录包含固定配置索引和所选通道当前描述指向的模板。正常发布不上传整个目录;release
|
|
90
|
+
脚本先上传单个不可变版本 ZIP,再发布 npm,最后单独覆盖固定配置索引:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
yt upload dist/rabetbase-cli/templates/projects/sub-app-react-demo-<version>.zip -r all -force
|
|
94
|
+
yt upload dist/rabetbase-cli/config/index.json -r all -force
|
|
64
95
|
```
|
|
65
96
|
|
|
66
|
-
|
|
67
|
-
`
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
新版 beta CLI 在 beta 描述缺失时兼容回退到顶层正式模板。
|
|
71
|
-
`check:cdn` / `check:cdn:beta` 在系统临时目录重建 ZIP,只读比对模板描述和仓内归档,
|
|
72
|
-
不会改动 `cdn/` 或 `dist/`。
|
|
97
|
+
以上顺序由 release 脚本执行,不作为日常手工步骤。必须向所有可用国家/地区发布并分别回读
|
|
98
|
+
配置和 ZIP;新增节点由统一路由中的 `cdn.lovrabet` 提供 host,不在 CDN 配置里维护重复映射。
|
|
99
|
+
release 脚本还会在 prepare 阶段记录两个 CDN 节点一致的共享配置摘要,并在归档上传和 config
|
|
100
|
+
切换前重新校验;另一通道、CLI policy 或配置摘要发生变化时停止发布,不覆盖较新的线上事实。
|
|
73
101
|
|
|
74
102
|
### 模板结构
|
|
75
103
|
|
|
@@ -93,7 +121,7 @@ npm run check:cdn:beta
|
|
|
93
121
|
## 注意事项
|
|
94
122
|
|
|
95
123
|
- `templates/projects/sub-app-react-demo/` 是项目模板真源,不是独立 Git 仓,也不是外部仓快照
|
|
96
|
-
- `rabetbase project create`
|
|
124
|
+
- `rabetbase project create` 固定读取统一配置索引,再从描述中的正式或 beta URL 下载 ZIP,校验大小与 SHA-256 后更新 `package.json` 与 `.rabetbase.json`;正式 CLI 读取顶层模板,beta CLI 优先读取 `beta.projectTemplate`;此仓库模板不进入 npm 发布包
|
|
97
125
|
- 模板文件名必须兼容 Windows、macOS 和 Linux;禁止符号链接、大小写冲突路径和 Windows 保留名称
|
|
98
126
|
- 有 AppCode 时,CLI 会重新生成 `src/api/api.ts` 和 `src/api/client.ts`
|
|
99
127
|
- 项目模板中不要保留真实 AppCode、真实数据集模型、`.git`、`node_modules`、`dist` 或个人配置
|