如何解决OpenFGA CLI容器转换DSL为JSON的乱码并实现自动转换?
OpenFGA DSL转JSON的ANSI乱码问题解决及自动转换实现
一、解决JSON里的ANSI转义码问题
你用的命令里加了-it参数,这会让Docker分配交互式终端,OpenFGA CLI默认在终端环境下输出带颜色的内容,那些[1m之类的就是ANSI样式转义码。搞定这个有两种办法:
方法1:移除-it参数
直接去掉这个参数,CLI就会输出纯文本JSON:
docker run --rm openfga/cli model transform "$(cat packages/fga/model/authModel.fga)" > packages/fga/model/authModel.json
加--rm是防止容器跑完后残留无用容器。
方法2:强制禁用颜色输出
要是非得保留-it,可以通过环境变量或者CLI参数关掉颜色:
# 用环境变量 docker run --rm -it -e NO_COLOR=1 openfga/cli model transform "$(cat packages/fga/model/authModel.fga)" > packages/fga/model/authModel.json # 或者用CLI自带参数 docker run --rm -it openfga/cli model transform --no-color "$(cat packages/fga/model/authModel.fga)" > packages/fga/model/authModel.json
二、实现DSL变更自动转JSON
要做到文件一改就自动转换,还得让项目自包含,推荐两种方案,都用Docker管理,不用用户本地装额外工具:
方案1:用Alpine+entr轻量监听
- 写个shell脚本
scripts/watch-fga-model.sh:
#!/bin/sh echo "开始监听authModel.fga..." while true; do # 用entr监听文件变化,触发转换命令 cat /model/authModel.fga | entr -d docker run --rm openfga/cli model transform "$(cat /model/authModel.fga)" > /model/authModel.json done
- 在
docker-compose.yml里加个专门的监听服务:
version: '3.8' services: fga-model-watcher: image: alpine:latest volumes: - ./packages/fga/model:/model - ./scripts:/scripts working_dir: /model command: sh /scripts/watch-fga-model.sh # 启动前先装entr entrypoint: sh -c "apk add --no-cache entr && exec $$0"
方案2:用Node.js的chokidar(贴合你的现有TS环境)
- 通过docker-compose装chokidar:
docker-compose run --rm your-node-service npm install chokidar --save-dev
- 写个TS监听脚本
packages/fga/scripts/watch-model.ts:
import chokidar from 'chokidar'; import { execSync } from 'child_process'; import path from 'path'; const dslFile = path.join(__dirname, '../model/authModel.fga'); const jsonFile = path.join(__dirname, '../model/authModel.json'); // 转换命令,用Docker执行 const transformCmd = `docker run --rm openfga/cli model transform "$(cat ${dslFile})" > ${jsonFile}`; // 先转一次初始JSON console.log('初始化FGA模型JSON...'); execSync(transformCmd, { stdio: 'inherit' }); // 监听DSL文件变化 chokidar.watch(dslFile, { ignoreInitial: true }).on('change', () => { console.log('FGA模型DSL已修改,正在转JSON...'); try { execSync(transformCmd, { stdio: 'inherit' }); console.log('模型JSON更新完成'); } catch (err) { console.error('转换失败:', err); } }); console.log(`正在监听${dslFile}变化...`);
- 在
package.json里加脚本:
{ "scripts": { "watch:fga-model": "tsx packages/fga/scripts/watch-model.ts" } }
- 启动监听:
docker-compose run --rm your-node-service npm run watch:fga-model
三、保证项目自包含
把所有脚本、docker-compose配置都提交到仓库,其他用户拉代码后,只需要启动docker-compose服务,就能自动处理模型转换和测试,不用本地装任何依赖,全靠Docker搞定。
内容的提问来源于stack exchange,提问作者Daniel Loiterton
相关产品推荐
相关产品推荐

