AWS AppSyncでiOS(Swift)用のコードを生成する時に勘違いしていたことがあったので、それについて公式のサンプルから理解できるように細かく書いておきます。私自身がAppSync歴1日なので正確に理解できているかもわかりませんので、その点についてはお手数おかけいたしますがコメントなどでご指摘よろしくお願いします。
また、現状(2020年)ではAppSyncの公式ドキュメントはAmplifyを使うことが前提とされており、Amplifyを使わない場合はやり方を探すのはかなり難しい。難しいので書き残しておきますというモチベーションです。
サンプルはAWS AppSync公式で説明されているサンプルスキーマ「イベントアプリ」からです。
最初に結論
おそらくこのページを見ている方が最も知りたいのはコード生成のコメントaws-appsync-codegen
についての使い方でしょうから最初に書いておきます。
# aws-appsync-codegen generate tmp/*.graphql --schema tmp/schema.json --target swift --output tmp/GraphQLAPI.swift
- tmp/*.graphql
- GraphQL リクエスト用のクエリを指定
-
*
にしているのはリクエストが複数ある場合にそれをtmpディレクトリに置いているためです - 後述の「クエリ画面」からコピペしてファイルにします
-
- GraphQL リクエスト用のクエリを指定
- tmp/schema.json
- GraphQLのための仕様
- 後述の「スキーマ画面」から「スキーマをエクスポート」でschema.jsonを選びます
- 注意: jsonを選びましょう。schema.graphqlではありません
- 後述の「スキーマ画面」から「スキーマをエクスポート」でschema.jsonを選びます
- GraphQLのための仕様
-
--target
はswiftを指定- 省略できますがこの説明のため丁寧に書いておきます
画面での説明
クエリ画面
スキーマ画面
aws-appsync-codegenの導入
npmをmacにDockerで入れることについて書いておきます。
iOSアプリ開発者的には、仕事でnpmの情報を追っているわけではなくバージョンの違いによる動作の違いを把握していないためシステムにnpm自身を入れたくないですし、なにか環境によるエラーが出た場合に面倒というのが強いです。
おそらくnpmをバージョン別に入れてそれを切り替えて使う方法(nodeenv?nodebrew?)もあるんでしょうが、そこはnpmをそこまで使うわけではないので考えたくないです。
nodeのimageをダウンロード
$ docker pull node
docker runしてコンソールでnpmを利用する
nodeのコンテナを起動し、コンソールに入ります
$ docker run -v (pwd)/graphql:/tmp -it --rm node /bin/bash
-
-it
- インタラクティブにターミナルを起動
-
-v
- ローカルとコンテナ内のボリュームを共有し、GraphQL リクエスト用のクエリとschema.jsonをコンテナ内でも使えるようにします
- (pwd)
- fishなので(pwd)
- bashだと$(pwd)かも
コンテナ内でnpmを使いaws-appsync-codegenをインストール
コンテナ内なのでグローバルにインストールしても良いかな、という感じです
# npm install -g aws-appsync-codegen
aws-appsync-codegenでコード生成する
# aws-appsync-codegen generate tmp/queries.graphql --schema tmp/schema.json --target swift --output tmp/GraphQLAPI.swift
- コード生成した結果も共有のボリュームに出力しています