2025-12-10 22:51:40 +01:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
# venv-create.sh
|
|
|
|
|
#
|
2025-12-12 12:15:40 +01:00
|
|
|
# Create/update a Python virtual environment for pkgmgr and install dependencies.
|
|
|
|
|
#
|
|
|
|
|
# Priority order:
|
|
|
|
|
# 1) pyproject.toml -> pip install (editable by default)
|
|
|
|
|
# 2) requirements.txt
|
|
|
|
|
# 3) _requirements.txt (legacy)
|
2025-12-10 22:51:40 +01:00
|
|
|
#
|
|
|
|
|
# Usage:
|
|
|
|
|
# PKGMGR_VENV_DIR=/home/dev/.venvs/pkgmgr bash scripts/installation/venv-create.sh
|
|
|
|
|
# or
|
|
|
|
|
# bash scripts/installation/venv-create.sh /home/dev/.venvs/pkgmgr
|
2025-12-12 12:15:40 +01:00
|
|
|
#
|
|
|
|
|
# Optional:
|
|
|
|
|
# PKGMGR_PIP_EDITABLE=0 # install non-editable (default: 1)
|
|
|
|
|
# PKGMGR_PIP_EXTRAS="dev,test" # install extras: .[dev,test]
|
|
|
|
|
# PKGMGR_PREFER_NIX=1 # print Nix hint and exit non-zero
|
2025-12-10 22:51:40 +01:00
|
|
|
|
|
|
|
|
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
|
|
|
cd "${PROJECT_ROOT}"
|
|
|
|
|
|
|
|
|
|
VENV_DIR="${PKGMGR_VENV_DIR:-${1:-${HOME}/.venvs/pkgmgr}}"
|
2025-12-12 12:15:40 +01:00
|
|
|
PIP_EDITABLE="${PKGMGR_PIP_EDITABLE:-1}"
|
|
|
|
|
PIP_EXTRAS="${PKGMGR_PIP_EXTRAS:-}"
|
|
|
|
|
PREFER_NIX="${PKGMGR_PREFER_NIX:-0}"
|
2025-12-10 22:51:40 +01:00
|
|
|
|
|
|
|
|
echo "[venv-create] Using VENV_DIR=${VENV_DIR}"
|
|
|
|
|
|
2025-12-12 12:15:40 +01:00
|
|
|
if [[ "${PREFER_NIX}" == "1" ]]; then
|
|
|
|
|
echo "[venv-create] PKGMGR_PREFER_NIX=1 set."
|
|
|
|
|
echo "[venv-create] Hint: Use Nix instead of a venv for reproducible installs:"
|
|
|
|
|
echo "[venv-create] nix develop"
|
|
|
|
|
echo "[venv-create] nix run .#pkgmgr -- --help"
|
|
|
|
|
exit 2
|
|
|
|
|
fi
|
|
|
|
|
|
2025-12-10 22:51:40 +01:00
|
|
|
echo "[venv-create] Ensuring virtualenv parent directory exists..."
|
|
|
|
|
mkdir -p "$(dirname "${VENV_DIR}")"
|
|
|
|
|
|
|
|
|
|
if [[ ! -d "${VENV_DIR}" ]]; then
|
2025-12-12 12:15:40 +01:00
|
|
|
echo "[venv-create] Creating virtual environment at: ${VENV_DIR}"
|
|
|
|
|
python3 -m venv "${VENV_DIR}"
|
2025-12-10 22:51:40 +01:00
|
|
|
else
|
2025-12-12 12:15:40 +01:00
|
|
|
echo "[venv-create] Virtual environment already exists at: ${VENV_DIR}"
|
2025-12-10 22:51:40 +01:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "[venv-create] Installing Python tooling into venv..."
|
|
|
|
|
"${VENV_DIR}/bin/python" -m ensurepip --upgrade
|
|
|
|
|
"${VENV_DIR}/bin/pip" install --upgrade pip setuptools wheel
|
|
|
|
|
|
2025-12-12 12:15:40 +01:00
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
# Install dependencies
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
if [[ -f "pyproject.toml" ]]; then
|
|
|
|
|
echo "[venv-create] Detected pyproject.toml. Installing project via pip..."
|
|
|
|
|
|
|
|
|
|
target="."
|
|
|
|
|
if [[ -n "${PIP_EXTRAS}" ]]; then
|
|
|
|
|
target=".[${PIP_EXTRAS}]"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ "${PIP_EDITABLE}" == "1" ]]; then
|
|
|
|
|
echo "[venv-create] pip install -e ${target}"
|
|
|
|
|
"${VENV_DIR}/bin/pip" install -e "${target}"
|
|
|
|
|
else
|
|
|
|
|
echo "[venv-create] pip install ${target}"
|
|
|
|
|
"${VENV_DIR}/bin/pip" install "${target}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
elif [[ -f "requirements.txt" ]]; then
|
|
|
|
|
echo "[venv-create] Installing dependencies from requirements.txt..."
|
|
|
|
|
"${VENV_DIR}/bin/pip" install -r requirements.txt
|
|
|
|
|
|
2025-12-10 22:51:40 +01:00
|
|
|
elif [[ -f "_requirements.txt" ]]; then
|
2025-12-12 12:15:40 +01:00
|
|
|
echo "[venv-create] Installing dependencies from _requirements.txt (legacy)..."
|
|
|
|
|
"${VENV_DIR}/bin/pip" install -r _requirements.txt
|
|
|
|
|
|
2025-12-10 22:51:40 +01:00
|
|
|
else
|
2025-12-12 12:15:40 +01:00
|
|
|
echo "[venv-create] No pyproject.toml, requirements.txt, or _requirements.txt found. Skipping dependency installation."
|
2025-12-10 22:51:40 +01:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "[venv-create] Done."
|