私は動く部分が多いソフトウェアプロジェクト開発チームの一員として働いています。私たちは開発中に頻繁に必要なコマンドとスクリプトを簡単に実行するためにMakefileを使用します。例は次のとおりです。
- Python仮想環境を設定します。
- ローカル開発データベースを初期化します。
- チェックを実行します。
- など。
これらのコマンドの多くは、追加のパラメータを使用したカスタマイズを必要としないため、Makefileターゲットは完全に機能します。
.PHONY: venv
venv:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
$ make venv
ただし、コマンドに追加のパラメータを渡す必要がある場合は、非常に面倒です。 2つの直接的な方法は次のとおりです。
- 変数を介して追加のパラメータを渡します(たとえば
make foo FOO_ARGS="lalala"
、.パラメータにスペースが含まれている場合は面倒で混乱します)。 - Makefileでターゲットを見つけ、シェルプロンプトにコピーして編集します。
ソリューションのアイデア
私は実際に必要なものについて非常に単純な概念を思いついた。たとえば、現在のディレクトリと親ディレクトリから呼び出された実行可能ファイルをrun
見つけ、そのファイルを実行してコマンドライン引数をドキュメントに渡すコマンドラインツールです。runfile
。 Pythonで実装すると、次のようになります。
#! /usr/bin/env python3
import sys, os, subprocess, pathlib
cwd = pathlib.Path().resolve()
# Go through the CWD (current working directory) and all its parents and look
# for an executable file called "runfile".
for dir in [cwd, *cwd.parents]:
run_script_path = dir / 'runfile'
if os.access(run_script_path, os.X_OK):
break
else:
print(
f'No executable runfile found in {cwd} or any of its parents.',
file=sys.stderr)
sys.exit(1)
# Run the runfile, forwarding any command line arguments to it. Use the parent
# of the runfile as CWD and pass the original CWD in the environment variable
# "RUN_PWD".
subprocess.run(
[run_script_path, *sys.argv[1:]],
cwd=dir,
env=dict(os.environ, RUN_PWD=str(cwd)))
実行ファイルは任意のスクリプト言語を使用できます。私はBashスクリプトになることができます:
#! /usr/bin/env bash
case "$1" in
venv)
rm -rf venv
echo python3 -m venv "${@:2}" venv
;;
lint)
pycodestyle --exclude='./venv,./node_modules,./.git' "${@:2}" .
;;
*)
echo "Unknown command: $1" >&2
exit 1
;;
esac
("${@:2}"
最初の引数の後にスクリプトの引数をコマンドラインに別の単語として挿入します。)
$ run venv --copies
# Would run "python3 -m venv --copies venv".
質問
より多くの機能を備えたツールはすでにありますか?単にファイルを実行するのではなく、ツールが独自の言語を使用してコマンドを定義した場合は問題ありません。
補足説明
npm
一部のビルドでは、定義を許可するなどのマイナーな機能でもこれをサポートしていることがわかります。scripts
コマンドラインから呼び出すことができます:
npm run foo -- args...
しかし、すでにスクリプト名の前に2つの単語が必要で、追加の--
パラメータの前に1つの単語が必要なので、あまり便利ではありません。
インストールコンソールスクリプトエントリポイントvirtualenvに行き、virtualenvを有効にすることは時々解決策かもしれません。しかし、この場合のユースケースの1つはプロジェクトのvirtualenvを設定することで、チキンと卵の問題です。
私はおそらくそれを破ることができることを知っています$(MAKECMDGOALS)
。いいえ。