こちらの続きです。
今回は、前回紹介できなかった スクリプト機能 について紹介します。

前提知識

Node.js で開発したことのある方はご存知かと思いますが、npm や yarn で依存性管理をする package.json には独自のスクリプトを書くことができます。

{
  ...
  "scripts": {
    "eslint": "eslint --ext .js,.vue ./src"
  }
  ...
}

上記は eslint というツールを利用して、コードのチェックを実行する処理です。
このスクリプトの実行時には node_modules/.bin が環境変数に含まれた状態なので、バイナリのパスを認識する必要がないというわけです。
もちろん、このスクリプトから別のスクリプトをコールすることもできます。

{
  ...
  "scripts": {
    "eslint": "eslint --ext .js,.vue ./src",
    "eslint:fix": "npm run eslint -- --fix"
  }
  ...
}

上記の eslint:fix では、eslint に引数を追加して実行しています(npm は引数を追加する場合に -- が必要なので上記のような書き方になっています)。

そして、このような機能が Pipenv にもあるのです。

導入

例えば Django プロジェクトの場合、以下のようなスクリプトをPipfileに記載しておくとタイプ量が減ってお得です。

[scripts]
manage = "python manage.py"

以下のコマンドで実行できます。
この場合は Pipenv が生成した仮想環境内の python を利用して実行してくれます。

pipenv run manage runserver
# -> python manage.py runserver が実行される

この機能は長いコマンドになるほど便利さを感じられます。
例えば、私はトークンを生成する際に利用するシークレットキーの作成コマンドを定義しています。
Laravel や Ruby on Rails にはこれを自動でやってくれるコマンドがありますが、Django には現時点でありません。
そのため Pipfile に以下のようなコマンドを定義しています(もちろん、これは manage.py にコマンドを追加しても良いです)。

[scripts]
key_generate = "python -c 'from django.core.management import utils; print(utils.get_random_secret_key())'"

これは以下コマンドで実行できます。

pipenv run key_generate

Ruby on Rails が rails s でローカルサーバを起動できるように、開発メンバー間で認識できるならコマンド名はもっと短くても良いかもしれません。

終わりに

いかがでしたでしょうか。
私自身、Python を使った開発に関わる機会がかなり増えてきていますが、いまだに requirements.txt を使っているプロジェクトが多いです。
運用がある程度決まっているならそれでも良いかと思いますが、色々と問題は多い印象を受けました(デプロイ方法すら記されていないプロジェクトもありました)。
新規・既存プロジェクト問わずに導入できるので、需要はあるかと思っています。
皆さんも Python 開発する際はぜひ使ってみてください。

おまけ

pipenv --venv
# -> 対象プロジェクトの仮想環境パスが出力される