.gitignoreをテンプレートから生成するツールを作った
はい、車輪の再発明です。
Git-ignore ~ template helper
インストール
pip install git-ignore
使い方
git-ignore python sass
複数のテンプレートを指定できます。この場合PythonのgitignoreとSassのgitignoreを合わせて.gitignore
に書き出します。
どうして作ったか
.gitignore
ファイルってみんなどう書いてるんでしょう。これと決めたテンプレートから持ってくるのがお手頃だと思うけど、他の人がどうやっているのかよく知らん。
ググってみるとこの手のツールはあるにはありそうで、だけど一強ぽいのが無い&Python製のは2系のままだった*1ので、再発明することにしました。
テンプレートはありがたいことに天下のGitHubが公開しているもの*2があったので、submoduleで取ってきて使うことに。
書き慣れていてインストールも簡単なPythonで書きます。click大好きおじさんです。
今回の新しい発見は、モジュールを作る際にモジュールの中に置いたファイルを利用する方法です。
何も考えずにwith open(...)
とか書くと実行時にファイルがありませんと怒られます。当然ですね。
で、モジュールの中のファイルをどうやって開くかというと、pkg_resources
を使います。*3*4
pkg_resources.resource_string() |
バイト文字列として開きます。 |
pkg_resources.resource_stream() |
ファイルぽく開くそうです。(StringIOか?) |
pkg_resources.listdir() |
ディレクトリ内をリスト形式で取得できます。os.path.listdir() と同じ形の返り値。 |
しかしこれだけではビルドするときにファイルが含まれません。 色々調べたのですが、 MANIFEST.in + include_package_data=True 説*5*6 とか見つかったものの機能せず。そもそもMANIFESTは自動生成されるっぽいのですが、それを手動で書いて何が嬉しいのかよくわかりませんでした。 結局setup.pyのドキュメントを読んで色々試した結果、
2. Writing the Setup Script — Python 3.7.0 documentation
package_data
という引数を指定することで解決しました。
あと、ヘルプメッセージを出力するのに標準モジュールのtextwrapが便利だなと感じました。 textwrap — Text wrapping and filling — Python 3.7.0 documentation
*1:なお書かれたのは7年前 https://github.com/jarodl/ignore
*2:https://github.com/github/gitignore
*3:https://stackoverflow.com/a/20885799/8776028
*4:clickのUtilityにも同様のメソッドがある。今回は使わなかった。http://click.pocoo.org/5/utils/#finding-application-folders
*5:https://python-packaging.readthedocs.io/en/latest/non-code-files.html
*6:こちらは実際にMANIFEST.inを使っているモジュールhttps://github.com/fhamborg/news-please/wiki/PyPI---How-to-upload-a-new-version