开发Ruby gem apipie-postman时如何持久化Postman集合uid
问题根因
每次手动执行rake任务时都会启动一个独立的Ruby进程,任务执行完成后进程直接销毁,你存储在内存中的常量、类实例变量都属于进程内的临时数据,进程结束后就会被清空,所以下一次运行rake任务时自然读取不到上一次存储的值。
可行解决方案
方案1:本地文件持久化存储UID
这是最简便的适配方案,将获取到的集合UID写入到项目本地的隐藏文件中,每次运行任务时先读取该文件判断是否存在已有UID:
- 可以约定存储文件为项目根目录下的
.apipie_postman_uid,记得将该文件加入.gitignore避免提交到代码仓库 - 示例代码如下:
# 定义UID存储路径,非Rails项目可以自行调整路径规则 UID_STORAGE_PATH = defined?(Rails) ? Rails.root.join('.apipie_postman_uid') : Pathname.new('.apipie_postman_uid') parse_apipie_file_and_create_postman_body # 读取已存储的UID saved_uid = File.exist?(UID_STORAGE_PATH) ? File.read(UID_STORAGE_PATH).strip : nil if saved_uid Faraday.put("https://api.getpostman.com/collections/#{saved_uid}", body, headers) else response = Faraday.post('https://api.getpostman.com/collections/', body, headers) if response.status == 200 new_uid = JSON.parse(response.body)['collection']['uid'] File.write(UID_STORAGE_PATH, new_uid) end end
方案2:通过环境变量传入UID
适合需要在CI/CD流水线中自动生成文档的场景,由使用者自行配置环境变量存储UID:
- 优先读取环境变量
ENV['POSTMAN_COLLECTION_UID'],存在则直接更新,不存在则走创建逻辑 - 创建成功后将UID输出到控制台,提示使用者配置到对应环境变量中即可
方案3:动态查询已有集合
不需要本地存储任何数据,每次运行任务时先调用Postman的集合列表接口,按集合名称匹配已存在的集合:
- 先调用
GET https://api.getpostman.com/collections接口获取当前账号下所有集合列表 - 匹配和你生成的集合名称一致的记录,拿到对应的UID执行更新
- 不存在匹配记录时再走创建逻辑,仅多一次API调用,无需维护额外存储
额外注意
你之前的代码中用Object.const_set设置小写的postman_uid不符合Ruby常量命名规范,Ruby约定常量名首字母必须大写,小写命名会触发语法警告,也可能导致常量查找异常。
内容的提问来源于stack exchange,提问作者Victor Motogna
相关产品推荐
相关产品推荐

