PDM Scripts#
npm run
と同様に、PDMではローカルパッケージをロードして任意のスクリプトやコマンドを実行できます。
Arbitrary Scripts#
1 |
|
プロジェクト環境内のパッケージを認識する環境でflask run-p 54321
を実行します。
Single-file Scripts#
Added in version 2.16.0
PDMでは、インラインスクリプトメタデータを使用して単一ファイルスクリプトを実行できます。
メタデータが埋め込まれたスクリプトの例を次に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
pdm run test_script.py
で実行すると、PDMは指定された依存関係がインストールされた一時的な環境を作成し、スクリプトを実行します。:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
前回作成した環境を再利用する場合は、--reuse-env
オプションを追加します。また、スクリプトメタデータに[tool.pdm]
セクションを追加して、PDMを設定することもできます。次に例を示します。:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
詳細については、specificationを参照してください。
User Scripts#
PDMは、pyproject.toml
のオプションの[tool.pdm.scripts]
セクションにあるカスタムスクリプトショートカットもサポートしています。
Note
[tool.pdm.scripts]
ディレクトリを[project.scripts]
と混同しないでください。後者は、ここで説明されているように、パッケージの一部としてコマンドをインストールするために使用されます。
その後、pdm run<script_name>
を実行して、PDMプロジェクトのコンテキストでスクリプトを呼び出すことができます。次に例を示します。
1 2 |
|
次にターミナルで:
1 2 |
|
次の引数がコマンドに追加されます:
1 2 |
|
Yarn-like script shortcuts
組み込みのショートカットがあり、スクリプトが組み込みコマンドまたはプラグインが提供するコマンドと競合しない限り、すべてのスクリプトをルートコマンドとして使用できます。つまり、start
スクリプトがあれば、pdm run start
とpdm start
の両方を実行できます。しかし、install
スクリプトがあれば、pdm run install
だけがそれを実行し、pdm install
は組み込みのinstall
コマンドを実行します。
PDMでは、次の4種類のスクリプトがサポートされています。:
cmd
#
プレーンテキストスクリプトは通常のコマンドと見なされますが、次のように明示的に指定することもできます。::
1 2 |
|
パラメータ間にコメントを追加する場合など、より便利な場合もあります。コマンドを文字列ではなく配列として指定するには、次のようにします。:
1 2 3 4 5 6 7 |
|
shell
#
シェルスクリプトを使用すると、パイプラインや出力のリダイレクトなど、シェル固有のタスクを実行できます。これは基本的にsubprocess.Popen()
とshell=True
を使用して実行されます:
1 2 |
|
call
#
スクリプトは、<module_name>:<func_name>
の形式でpython関数を呼び出すように定義することもできます。:
1 2 |
|
この関数には、リテラル引数を指定できます。:
1 2 |
|
composite
#
このスクリプトは、他の定義済みスクリプトを実行します。:
1 2 3 4 |
|
pdm run all
を実行すると、まずlint
が実行され、lint
が成功した場合はtest
が実行されます。
Added in version 2.13.0
デフォルトの動作を上書きし、失敗後に残りのスクリプトの実行を継続するには、keep_going
オプションをtrue
に設定します。
1 2 3 4 5 |
|
keep_going
がtrue
に設定されている場合、複合スクリプトの戻りコードは、すべてが成功した場合は'0'、または最後に失敗した個々のスクリプトのコードのいずれかになります。
呼び出されたスクリプトに引数を指定することもできます。
1 2 3 4 |
|
Note
コマンド行で渡された引数は、呼び出された各タスクに与えられます。
composite
スクリプトを使用して、複数のコマンドを組み合わせることもできます。:
1 2 3 4 5 |
|
Script Options#
env
#
現在のシェルに設定されているすべての環境変数はpdm run
で見ることができ、実行時に展開されます。さらに、pyproject.toml
でいくつかの固定環境変数を定義することもできます。
1 2 3 |
|
Note how we use TOML's syntax to define a composite dictionary.
複合辞書を定義するためにTOML's syntaxをどのように使用しているかに注目してください。
About environment variable substitution
"環境変数の代入について"スクリプト仕様の変数は、すべてのスクリプトタイプで代入できます。cmd
スクリプトでは、${VAR}
構文のみがすべてのプラットフォームでサポートされていますが、shell
スクリプトでは、構文はプラットフォームに依存します。たとえば、Windows cmdは%VAR%
を使用し、bashは$VAR
を使用します。
Note
複合タスクレベルで指定された環境変数は、呼び出されたタスクで定義された環境変数よりも優先されます。
env_file
#
すべての環境変数をdotenvファイルに保存して、PDMに読み取らせることもできます。:
1 2 3 |
|
The variables within the dotenv file will not override any existing environment variables. If you want the dotenv file to override existing environment variables use the following:
dotenvファイル内の変数は、既存の環境変数を上書きしません。 dotenvファイルで既存の環境変数を上書きする場合は、次のようにします。:
1 2 3 |
|
Environment variable loading order
異なるソースからロードされた環境変数は、次の順序でロードされます。:
- OS環境変数
PDM_PROJECT_ROOT
、PATH
、VIRTUAL_ENV
などのプロジェクト環境env_file
で指定されたDotenvファイルenv
で指定された環境変数のマッピング
後者のソースからの環境変数は、前者のソースからの環境変数を上書きします。複合タスクレベルで指定されたdotenvファイルは、呼び出されたタスクによって定義された環境変数を上書きします。
env varには、以前にロードされたソースからの別のenv varへの参照を含めることができます。次に例を示します。:
1 2 |
|
FOO=hello-42
になります。この参照には、${VAR:-default}
という構文でデフォルト値を含めることもできます。
working_dir
#
Added in version 2.13.0
スクリプトの現在の作業ディレクトリを設定できます。
1 2 3 |
|
相対パスは、プロジェクトのルートに対して解決されます。
site_packages
#
実行環境が外部のPythonインタプリタから適切に分離されていることを確認するために、次のいずれかの条件が満たされない限り、選択されたインタプリタのsite-packagesはsys.path
にロードされません。
- 実行ファイルは
PATH
からのものですが、__pypackages__
フォルダ内にはありません。 pdm run
の後に-s/--site-packages
フラグがあります。site_packages=true
は、スクリプトテーブルまたはグローバル設定キー_
のいずれかにあります。
PEP 582を有効にして(pdm run
接頭辞なしで)実行している場合、site-packagesは常にロードされることに注意してください。
Shared Options#
pdm run
で実行されるすべてのタスクでオプションを共有する場合は、[tool.pdm.scripts]
テーブルの特別なキー_
の下にオプションを記述します。:
1 2 3 4 |
|
また、タスク内では、環境変数PDM_PROJECT_ROOT
がプロジェクトルートに設定されます。
Arguments placeholder#
デフォルトでは、ユーザが指定した追加引数はすべて、単にコマンド(またはcomposite
タスクのすべてのコマンド)に追加されます。
ユーザが提供する追加引数をより詳細に制御したい場合は、{args}
プレースホルダを使用できます。これはすべてのスクリプトタイプで使用でき、それぞれに対して適切に補間されます。
1 2 3 4 |
|
これは以下の補間を生成すします(これらは実際のスクリプトではなく、ここでは補間を説明するためだけのものです)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
ユーザー引数を指定しない場合に使用されるデフォルト値をオプションで指定できます。
1 2 |
|
will produce the following:
1 2 3 4 |
|
Note
プレースホルダが検出されるとすぐに、引数は追加されなくなります。これはcomposite
スクリプトにとって重要です。なぜなら、サブタスクの1つでプレースホルダが検出されても、サブタスクの引数が追加されないため、プレースホルダを必要とするすべてのネストされたコマンドに明示的にプレースホルダを渡す必要があるからです。
Note
call
スクリプトは{args}
プレースホルダをサポートしていません。なぜなら、そのような複雑なケースなどを処理するためにsys.argv
に直接アクセスできるからです。
{pdm}
placeholder#
複数のPDMがインストールされている場合や、pdm
が別の名前でインストールされている場合があります。これは、CI/CDの状況や、異なるリポジトリで異なるPDMバージョンを使用している場合などに発生します。スクリプトをより堅牢にするには、{pdm}
を使用してスクリプトを実行するPDMエントリポイントを使用します。これは{sys.executable} -m pdm
に展開されます。
1 2 |
|
次のように出力されます。:
1 2 3 4 5 |
|
Note
上記の例ではPDM 2.8を使用していますが、この機能は2.10シリーズで導入され、Showcase用にバックポートされただけです。
Show the List of Scripts#
使用可能なスクリプトショートカットのリストを表示するには、pdm run --list/-l
を使用します。:
1 2 3 4 5 6 7 8 |
|
スクリプトの説明にhelp
オプションを追加すると、上記の出力のDescription
列に表示されます。
Note
名前がアンダースコア(_
)で始まるタスクは内部タスク(helpers...)と見なされ、リストには表示されません。
Pre & Post Scripts#
npm
と同様に、PDMはプリスクリプトとポストスクリプトによるタスクの構成もサポートしており、プリスクリプトは指定されたタスクの前に実行され、ポストスクリプトは後に実行されます。
1 2 3 4 |
|
この例では、pdm run compress
はこれら3つのスクリプトをすべて順番に実行します。
The pipeline fails fast
pre - self - postスクリプトのパイプラインでは、失敗すると後続の実行がキャンセルされます。
Hook Scripts#
特定の状況では、PDMは実行する特殊なフックスクリプトを検索します。
post_init
:pdm init
の後に実行しますpre_install
:パッケージをインストールする前に実行しますpost_install
:パッケージがインストールされた後に実行されます。pre_lock
:依存性解決の前に実行post_lock
:依存関係の解決後に実行pre_build
:配布物を構築する前に実行しますpost_build
:ディストリビューションがビルドされた後に実行されます。pre_publish
:配布物を公開する前に実行しますpost_publish
:配布物が公開された後に実行されます。pre_script
:スクリプトの前に実行されます。post_script
:任意のスクリプトの後に実行します。pre_run
:runスクリプトを呼び出す前に一度実行します。post_run
:runスクリプトを呼び出した後に一度実行します。
Note
事前スクリプトと事後スクリプトは引数を受け取ることができません。
Avoid name conflicts
[tool.pdm.scripts]
テーブルの下にinstall
スクリプトが存在する場合、pre_install
スクリプトはpdm install
とpdm run install
の両方によってトリガされます。そのため、保存された名前は使用しないことをお勧めします。
Note
複合タスクには、事前スクリプトと事後スクリプトを含めることもできます。呼び出されたタスクは、独自の事前スクリプトと事後スクリプトを実行します。
Skipping scripts#
フックや事前スクリプトと事後スクリプトなしでスクリプトを実行することが望ましい場合があるため、preとpostのすべてのフックを無効にする--skip=:all
があります。また、--skip=:pre
と--skip=:post
では、それぞれすべてのpre_*
フックとすべてのpost_*
フックをスキップすることができます。
前のスクリプトは必要だが後のスクリプトは必要ない場合や、複合タスクから1つを除くすべてのタスクが必要な場合もあります。これらのユースケースでは、除外するタスクまたはフック名のリストを受け入れる細粒状--skip
パラメータがあります。
1 |
|
このコマンドはmy-composite
タスクを実行し、pre_task1
フックとtask2
およびそのフックをスキップします。
PDM_SKIP_HOOKS
環境変数にスキップリストを指定することもできますが、--skip
パラメータを指定するとすぐに上書きされます。
フックとプリ/ポストスクリプトの動作の詳細については、the dedicated hooks pageを参照してください。