LoginSignup
0
0

More than 1 year has passed since last update.

swaggerが肥大化したので分離した

Posted at

背景

途中からジョインしたプロジェクトにて、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にしても面白いかも

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0