結論
requirements.txtにtypesystem==0.2.5
を追加すると解決します。
起きたこと
二日前にビルド成功してたのに、Cloud RunでResponderのAPIのビルドが上手くいかない。コードの変更によって上手くいってないのかと思ったので、コミット巻き戻して確認したりしたが、どうやら
import responder
でこける。
エラー全文
AttributeError: module 'typesystem' has no attribute 'SchemaDefinitions'
at <module> (/usr/local/lib/python3.9/site-packages/apistar/schemas/jsonschema.py:3)
at <module> (/usr/local/lib/python3.9/site-packages/apistar/schemas/openapi.py:6)
at <module> (/usr/local/lib/python3.9/site-packages/apistar/schemas/__init__.py:1)
at <module> (/usr/local/lib/python3.9/site-packages/apistar/core.py:7)
at <module> (/usr/local/lib/python3.9/site-packages/apistar/__init__.py:11)
at <module> (/usr/local/lib/python3.9/site-packages/responder/ext/schema/__init__.py:4)
at <module> (/usr/local/lib/python3.9/site-packages/responder/api.py:25)
at <module> (/usr/local/lib/python3.9/site-packages/responder/core.py:1)
at <module> (/usr/local/lib/python3.9/site-packages/responder/__init__.py:1)
at <module> (/app/main.py:7)
したこと
- 二日前にはビルド成功していたので、二日前のコードに戻してビルド→動かない
-
pip show responder
で依存関係確認したが大丈夫そう。これはどのバージョンに依存してるとかまで見れる。
解決策
ちゃんとエラーを読んだ。前まで上手くいってたので、前のコードに戻しても上手くいかないのは自分のせいだと思ったのがミスだった。全人類エラーを読め
responder
は apistar
に依存。
pip show apistar
で依存関係を確認すると、
Name: apistar
Version: 0.7.2
Summary: API documentation, validation, mocking, and clients.
Home-page: https://docs.apistar.com/
Author: Tom Christie
Author-email: tom@tomchristie.com
License: BSD
Location: c:\users\yuuta\anaconda3\lib\site-packages
Requires: click, typesystem, jinja2, pyyaml, requests
Required-by: responder
typesystemに依存してる。
AttributeError: module 'typesystem' has no attribute 'SchemaDefinitions'
といわれているので、実際のコードをGithubで見に行ってみた。
(この写真は記事投稿時の写真。見に行った当時は2days ago に変更が入っていた)
この時点でかなり嫌な予感
実際のcommitを眺める。
https://github.com/encode/typesystem/commit/851b60f3e08ae37b6548cc42e0e5407934f0a0d9
31ファイル変更は多いので、SchemaDefinitions
で検索
「あっ...名前、変えられたんですね」
このcommitがVersion 0.3.0なので、requirements.txt
の中身にtypesystem==0.2.5
を追加し、解決。
apistarが対応するまでは、これで対応できるはず。ちゃんとpip freeze
でバージョンを管理すればローカルで動いてたらCloud Run上でも動いたはずなのに、余計な時間を過ごしました。