You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.2 KiB
97 lines
2.2 KiB
|
2 months ago
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||
|
|
|
||
|
|
log() {
|
||
|
|
echo "$1"
|
||
|
|
}
|
||
|
|
|
||
|
|
PYTHON_BIN="${PYTHON_BIN:-}"
|
||
|
|
if [[ -z "${PYTHON_BIN}" ]]; then
|
||
|
|
if command -v python3 >/dev/null 2>&1; then
|
||
|
|
PYTHON_BIN="python3"
|
||
|
|
else
|
||
|
|
PYTHON_BIN="python"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
if ! command -v "${PYTHON_BIN}" >/dev/null 2>&1; then
|
||
|
|
echo "Python not found. Please install Python 3.10+ and retry."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
log "Building React UI (static assets)..."
|
||
|
|
pushd "${ROOT_DIR}/apps/dsa-web" >/dev/null
|
||
|
|
if [[ ! -d node_modules ]]; then
|
||
|
|
npm install
|
||
|
|
fi
|
||
|
|
npm run build
|
||
|
|
popd >/dev/null
|
||
|
|
|
||
|
|
log "Building backend executable..."
|
||
|
|
if ! "${PYTHON_BIN}" -m PyInstaller --version >/dev/null 2>&1; then
|
||
|
|
"${PYTHON_BIN}" -m pip install pyinstaller
|
||
|
|
fi
|
||
|
|
|
||
|
|
log "Installing backend dependencies..."
|
||
|
|
"${PYTHON_BIN}" -m pip install -r "${ROOT_DIR}/requirements.txt"
|
||
|
|
|
||
|
|
if [[ -d "${ROOT_DIR}/dist/backend" ]]; then
|
||
|
|
rm -rf "${ROOT_DIR}/dist/backend"
|
||
|
|
fi
|
||
|
|
mkdir -p "${ROOT_DIR}/dist/backend"
|
||
|
|
|
||
|
|
hidden_imports=(
|
||
|
|
"json_repair"
|
||
|
|
"api"
|
||
|
|
"api.app"
|
||
|
|
"api.deps"
|
||
|
|
"api.v1"
|
||
|
|
"api.v1.router"
|
||
|
|
"api.v1.endpoints"
|
||
|
|
"api.v1.endpoints.analysis"
|
||
|
|
"api.v1.endpoints.history"
|
||
|
|
"api.v1.endpoints.stocks"
|
||
|
|
"api.v1.endpoints.health"
|
||
|
|
"api.v1.schemas"
|
||
|
|
"api.v1.schemas.analysis"
|
||
|
|
"api.v1.schemas.history"
|
||
|
|
"api.v1.schemas.stocks"
|
||
|
|
"api.v1.schemas.common"
|
||
|
|
"api.middlewares"
|
||
|
|
"api.middlewares.error_handler"
|
||
|
|
"src.services"
|
||
|
|
"src.services.task_queue"
|
||
|
|
"src.services.analysis_service"
|
||
|
|
"src.services.history_service"
|
||
|
|
"uvicorn.logging"
|
||
|
|
"uvicorn.loops"
|
||
|
|
"uvicorn.loops.auto"
|
||
|
|
"uvicorn.protocols"
|
||
|
|
"uvicorn.protocols.http"
|
||
|
|
"uvicorn.protocols.http.auto"
|
||
|
|
"uvicorn.protocols.websockets"
|
||
|
|
"uvicorn.protocols.websockets.auto"
|
||
|
|
"uvicorn.lifespan"
|
||
|
|
"uvicorn.lifespan.on"
|
||
|
|
)
|
||
|
|
|
||
|
|
hidden_import_args=()
|
||
|
|
for module in "${hidden_imports[@]}"; do
|
||
|
|
hidden_import_args+=("--hidden-import=${module}")
|
||
|
|
done
|
||
|
|
|
||
|
|
pushd "${ROOT_DIR}" >/dev/null
|
||
|
|
cmd=("${PYTHON_BIN}" -m PyInstaller --name stock_analysis --onedir --noconsole --add-data "static:static")
|
||
|
|
cmd+=("${hidden_import_args[@]}" "main.py")
|
||
|
|
|
||
|
|
echo "Running: ${cmd[*]}"
|
||
|
|
"${cmd[@]}"
|
||
|
|
popd >/dev/null
|
||
|
|
|
||
|
|
cp -R "${ROOT_DIR}/dist/stock_analysis" "${ROOT_DIR}/dist/backend/stock_analysis"
|
||
|
|
|
||
|
|
log "Backend build completed."
|