背景
途中からジョインしたプロジェクトにて、swaggerを使っていたのですが、YAMLファイルが10,000行近くと保守がとても大変だったので、分割できるらしいmulti-file-swagger
を使いました。
後から、swagger-multi
?を知ったので特に比較してこちらを使うことにしたわけではないです。
swagger自体については他にいっぱい記事があるのでここでは記述しません。
できたプログラム
インストール
自分はなんとなくグローバルのインストールは嫌だったので、devで入れました
npm i -D multi-file-swagger
実行
npm run separate
プログラム
ライブラリのインストール
#!/usr/bin/env node
'use strict';
var resolve = require('json-refs').resolveRefs;
var YAML = require('js-yaml');
var fs = require('fs');
分離するkeyの指定。
1段階必要なものと2段階必要なものがあったのでそれぞれ定義した
const key_1 = ['info', 'securityDefinitions','tags'];
const key_2 = ['paths', 'definitions'];
分離するファイルのロード(実際はエラーハンドリング付き)
var file = program.args[0];
var original = YAML.safeLoad(fs.readFileSync(file).toString());
この後使う各ファイルを保存するためのプログラム
ちなみにミスってもファイルはそのまま残る。トランザクション的なものつけるべきかな?
const writeFile = (filename, data) =>{
fs.writeFile(
filename,
YAML.dump(data),
'utf8',
(e)=>{
if(e){
console.log(e.message);
process.exit(1)
}
}
)
}
各keyに対してループを行いフォルダおよびファイルを保存する
const keys = key_2.concat(key_1);
for (const dir_name of keys){
if(!fs.existsSync(`${dir_name}/`)){
fs.mkdirSync(`${dir_name}`);
}
const dir_origin = original[dir_name];
console.log(`${dir_name}/index.yaml`);
if (key_2.includes(dir_name)) {
for(const indexes of Object.keys(dir_origin)) {
const filename = indexes.replace(/^\//,'').replace(/\//g,'-') + '.yaml';
writeFile(`${dir_name}/${filename}`, dir_origin[indexes]);
dir_origin[indexes] = {$ref: './'+filename}
console.log(' ', filename);
}
}
writeFile(`${dir_name}/index.yaml`, dir_origin);
original[dir_name] = {$ref: `./${dir_name}/index.yaml`}
}
writeFile(`separated.yaml`, original);
console.log('succssess');
展望
- もう少し一般化する
- 元々あったjsonにも対応した方がいいのか?
- 分離した後例えば新規のpathを追加する時いちいち色々追加するのはめんどくさいのでこれもコマンド化する
- npmにしても面白いかも