저는 움직이는 부분이 많은 소프트웨어 프로젝트 개발팀의 일원으로 일하고 있습니다. 우리는 개발 중에 자주 필요한 명령과 스크립트를 쉽게 실행하기 위해 Makefile을 사용합니다. 예는 다음과 같습니다.
- Python 가상 환경을 설정합니다.
- 로컬 개발 데이터베이스를 초기화합니다.
- 점검을 실행하십시오.
- 등.
이러한 명령의 대부분은 추가 매개변수를 사용한 사용자 정의가 필요하지 않으므로 Makefile 대상이 완벽하게 작동합니다.
.PHONY: venv
venv:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
$ make venv
그러나 때때로 명령에 추가 매개변수를 전달해야 하는 경우에는 매우 번거로울 수 있습니다. 두 가지 직접적인 방법은 다음과 같습니다.
- 변수를 통해 추가 매개변수를 전달합니다(예
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...
하지만 이미 스크립트 이름 앞에 두 단어가 필요하고 --
추가 매개변수 앞에 한 단어가 필요하므로 그다지 편리하지 않습니다.
설치콘솔 스크립트 진입점virtualenv로 가서 virtualenv를 활성화하는 것이 때때로 해결책이 될 수 있습니다. 하지만 이 경우 사용 사례 중 하나는 프로젝트의 virtualenv를 설정하는 것이므로 닭고기와 달걀의 문제입니다.
나는 아마 그것을 깨뜨릴 수 있다는 것을 안다 $(MAKECMDGOALS)
. 아니요.