背景・動機
IntelliJで開発するとき、依存ライブラリ(External Libraries)を手元に用意しておかないとジャンプとか補完とか便利機能が効かなくなる。
ただnpmならProject(intellijのProjectのこと。大体Gitのリポジトリ単位)のディレクトリ以下にしか影響を及ぼさないので問題ないのだが、
pythonのpipのデフォだと、全Projectから参照可能なinstallをする。書いたコードが手元で動いた理由が、実は別Projectの依存関係のおかげだったりしたらまずい。というか汚れるのがちょっと......(潔癖症)
venvも悪くないけど(AI周りはvenv流行ってるし)、docker開発が現場ではメジャーだと思う。
IntelliJのinterpreterをDockerに繋ぐことで、コンテナ内のExternal Libraryを参照させる1。
方法
- Preferences2->Pluginsで
Docker
を入れる - Preferences->Build,Execution,Deployment->Dockerで
+
を押す
- Docker for Macがデフォルト。Connection successfulが出たらOK
- docker-composeを使う場合は、Preferences->Build,Execution,Deployment->Docker->Toolsでパスを確認
-docker compose
とサブコマンドで使っているならv2なのでパスじゃなくてチェックボックス - docker( compose)の使いたいコンテナ(サービス)を起動しておく
- File->Project Structure3でSDKsを選択。(IntelliJならPythonのpluginsを入れておき、)
+
->Add Python SDK
->Docker( Compose)
4を選択し設定。docker composeの場合、configを複数重ねられる。virtual envはAdd Local...
で選択 - その場でDockerとの接続確認が行われ、Project Settings->ModulesのDependenciesに登録される。ダブルクリックするとPlatform Settings->SDKsに飛ぶので、Packagesで依存ライブラリがちゃんとあるか確認
これで再起動すれば完了です。
indexingに少し時間がかかると思いますが、Navigate to Definition(定義箇所へジャンプ、Command +B or Ctrl + B)などが使えます。
docker内部でpoetryを使っている
docker外ならこの設定で良いが、docker内なら以下など。
$docker compose exec -it service /bin/sh
$ poetry env info
Virtualenv
Python: 3.11.4
Implementation: CPython
Path: /path
Executable: /path/bin/python
Valid: True
...
上のProject Structureでの設定中のdocker( compose)でのpython interpreterをpoetryのpathに変更(/path/bin/python
)
おまけ
この方法での開発を推奨するケース
- localに環境を構築したくない
- 今回のケースならpythonやらpipやら入れたくない場合
- 依存パッケージの導入がlocalだと難しい・面倒
- 開発に使うライブラリの導入についてDockerfileは既にあるがlocalで構築するには難しい・あれこれマシンにinstallして汚したくない
- 概要の通り、言語のデファクトのパッケージマネージャの特性に問題がある
-
npm install
なら先述の通り、そのProject以下でしか依存ライブラリは呼び出せず他のProjectへは影響を与えない(注意点として、Projectディレクトリの親階層にnode_modules
があるとそこのモジュールも利用できる)が、今回題材にしたPythonのpip install
は全プロジェクトに影響を与える - pyenvでユーザーディレクトリ以下の管理に変えても、pythonのversion単位にパッケージが集約されてしまい、Projectと依存パッケージが紐付かず下記不都合が生じる
- Projectで依存として明記されていないパッケージのモジュールも呼び出せてしまう。結果として
requirements.txt
やconstraints.txt
から漏れて、他の人が環境を再現できなかったり、リリースできなかったり - Projectとパッケージが紐付いていないので消すのが面倒。他のProjectに影響が出てしまったり
- 色んなProjectで
pip install
を繰り返したせい(?)でpip list
で表示されるのにimport Errorが起きたり(ex, airflow入れるとsixが消えたり)
- Projectで依存として明記されていないパッケージのモジュールも呼び出せてしまう。結果として
-
idea tips
対応言語
IntelliJにPythonプラグインを入れればPyCharmの補完が使えるし、同様にPhpStormの代替にもできます。
NodeJSやGoにも対応しているので、All Products Pack買う必要ないと思ってたのですが、実はC/C++などいくつかの言語には対応してなかったんですね......
詳細は下記を参照ください5。
https://www.jetbrains.com/products.html#
PHP pluginはデフォであれこれインストールしてる?
PHP pluginを有効にしてると、PHPを使ってないプロダクトでもapacheなどが勝手にExternal Librariesに入っているように見えます。
今のところ回避策を見つけられてない......
Project treeが壊れたら
File->Project Structure3でModuleを見直して再起動すれば解決します
Preferencesじゃないってのをよく忘れます
File Pathから開く
ディレクトリ数の多いProjectだとツリーを展開して探すの面倒ですよね
Tools->Create Command-line Launcherで使えるideaコマンドなら、パス指定でTerminalから開けます
https://pleiades.io/help/idea/working-with-the-ide-features-from-command-line.html
$idea path/to/file
# lineも指定でき`git grep`と組み合わせるとコピペでその行数から開けて便利
$git grep 'class Hoge' ./a/b
a/b/c.py:800:class Hoge(fuga):
$idea a/b/c.py:800
推しショートカット
- Search Everywhere(どこでも検索):Shift + Shift
- Show Intention Actions(よしな):Option(Alt) + Enter
- Find Action(アクション検索):(Ctrl)+Shift+A
- ここからscratch fileをよく使う。特にJSON
- Navigation back or forward(カーソル位置の戻る・進む):
Cmd + [
or ]- vimでいうCtrl+oだがファイル横断なのが便利
- Page top: fn + Cmd + left-arrow