diff --git a/scripts/watch-tenantapi-forlinux.sh b/scripts/watch-tenantapi-forlinux.sh new file mode 100755 index 0000000..50987f3 --- /dev/null +++ b/scripts/watch-tenantapi-forlinux.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# 用法:在 Linux 终端执行本脚本,后台启动 TenantApi 的 dotnet watch(开发用,不需要 docker build)。 +# 前置:已安装并运行 Docker。 +set -euo pipefail +trap 'echo "发生错误:${BASH_COMMAND}" >&2' ERR + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo_root="$(cd "${script_dir}/.." && pwd)" + +container_name="${CONTAINER_NAME:-takeout.api.tenant}" +docker_network="${DOCKER_NETWORK:-web_apps}" +host_port="${HOST_PORT:-7903}" +container_port="${CONTAINER_PORT:-7903}" +sdk_image="${SDK_IMAGE:-mcr.microsoft.com/dotnet/sdk:10.0}" +nuget_volume="${NUGET_VOLUME:-takeout-nuget}" +project_path="${PROJECT_PATH:-src/Api/TakeoutSaaS.TenantApi/TakeoutSaaS.TenantApi.csproj}" +environment="${ASPNETCORE_ENVIRONMENT:-Development}" + +echo "工作目录:${repo_root}" +echo "使用 SDK 镜像:${sdk_image}" +echo "容器:${container_name} 端口:${host_port}:${container_port} 网络:${docker_network}" +echo "项目:${project_path} 环境:${environment}" + +# 1. (空行后) 确保 network 存在(用于连接同网络内的 postgres/redis 等依赖) +if [ -n "${docker_network}" ]; then + if ! docker network inspect "${docker_network}" >/dev/null 2>&1; then + echo "Docker network 不存在,正在创建:${docker_network}" + docker network create "${docker_network}" >/dev/null + fi +fi + +# 2. (空行后) 持久化 NuGet 缓存,加速 restore/build +if ! docker volume inspect "${nuget_volume}" >/dev/null 2>&1; then + echo "NuGet volume 不存在,正在创建:${nuget_volume}" + docker volume create "${nuget_volume}" >/dev/null +fi + +# 3. (空行后) 替换旧容器(如存在) +if docker ps -a --format '{{.Names}}' | grep -qx "${container_name}"; then + echo "发现旧容器,正在移除:${container_name}" + docker rm -f "${container_name}" >/dev/null +fi + +run_args=() +if [ -n "${docker_network}" ]; then + run_args+=(--network "${docker_network}") +fi + +echo "启动 dotnet watch(后台运行)..." +docker run -d --name "${container_name}" \ + "${run_args[@]}" \ + -p "${host_port}:${container_port}" \ + -v "${repo_root}":/src \ + -w /src \ + -v "${nuget_volume}":/root/.nuget/packages \ + -e ASPNETCORE_ENVIRONMENT="${environment}" \ + -e ASPNETCORE_URLS="http://+:${container_port}" \ + -e DOTNET_USE_POLLING_FILE_WATCHER=1 \ + -e DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER=1 \ + "${sdk_image}" \ + dotnet watch --project "${project_path}" run + +echo "已启动。查看日志:docker logs -f ${container_name}" +echo "Swagger:http://localhost:${host_port}/api/docs (兼容入口 /swagger)" + diff --git a/scripts/watch-tenantapi.ps1 b/scripts/watch-tenantapi.ps1 new file mode 100644 index 0000000..4996ff8 --- /dev/null +++ b/scripts/watch-tenantapi.ps1 @@ -0,0 +1,73 @@ +<# +用法:在 PowerShell 中执行本脚本,后台启动 TenantApi 的 dotnet watch(开发用,不需要 docker build)。 +前置:已安装并运行 Docker Desktop。 +#> + +trap { + Write-Host "发生错误:" $_ -ForegroundColor Red + Read-Host "按回车关闭窗口" + exit 1 +} + +$ErrorActionPreference = 'Stop' + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$repoRoot = Split-Path -Parent $scriptDir + +$containerName = if ($env:CONTAINER_NAME) { $env:CONTAINER_NAME } else { 'takeout.api.tenant' } +$dockerNetwork = if ($env:DOCKER_NETWORK) { $env:DOCKER_NETWORK } else { 'web_apps' } +$hostPort = if ($env:HOST_PORT) { $env:HOST_PORT } else { '7903' } +$containerPort = if ($env:CONTAINER_PORT) { $env:CONTAINER_PORT } else { '7903' } +$sdkImage = if ($env:SDK_IMAGE) { $env:SDK_IMAGE } else { 'mcr.microsoft.com/dotnet/sdk:10.0' } +$nugetVolume = if ($env:NUGET_VOLUME) { $env:NUGET_VOLUME } else { 'takeout-nuget' } +$projectPath = if ($env:PROJECT_PATH) { $env:PROJECT_PATH } else { 'src/Api/TakeoutSaaS.TenantApi/TakeoutSaaS.TenantApi.csproj' } +$environment = if ($env:ASPNETCORE_ENVIRONMENT) { $env:ASPNETCORE_ENVIRONMENT } else { 'Development' } + +Write-Host "工作目录:$repoRoot" +Write-Host "使用 SDK 镜像:$sdkImage" +Write-Host "容器:$containerName 端口:$hostPort`:$containerPort 网络:$dockerNetwork" +Write-Host "项目:$projectPath 环境:$environment" + +# 1. (空行后) 确保 network 存在(用于连接同网络内的 postgres/redis 等依赖) +if (-not [string]::IsNullOrWhiteSpace($dockerNetwork)) { + $networkExists = (docker network ls --format '{{.Name}}') -contains $dockerNetwork + if (-not $networkExists) { + Write-Host "Docker network 不存在,正在创建:$dockerNetwork" + docker network create $dockerNetwork | Out-Null + } +} + +# 2. (空行后) 持久化 NuGet 缓存,加速 restore/build +$volumeExists = (docker volume ls --format '{{.Name}}') -contains $nugetVolume +if (-not $volumeExists) { + Write-Host "NuGet volume 不存在,正在创建:$nugetVolume" + docker volume create $nugetVolume | Out-Null +} + +# 3. (空行后) 替换旧容器(如存在) +if ((docker ps -a --format '{{.Names}}') -contains $containerName) { + Write-Host "发现旧容器,正在移除:$containerName" + docker rm -f $containerName | Out-Null +} + +$runArgs = @() +if (-not [string]::IsNullOrWhiteSpace($dockerNetwork)) { + $runArgs += @('--network', $dockerNetwork) +} + +Write-Host "启动 dotnet watch(后台运行)..." +docker run -d --name $containerName @runArgs ` + -p "$hostPort`:$containerPort" ` + -v "$repoRoot`:/src" ` + -w /src ` + -v "$nugetVolume`:/root/.nuget/packages" ` + -e "ASPNETCORE_ENVIRONMENT=$environment" ` + -e "ASPNETCORE_URLS=http://+:$containerPort" ` + -e "DOTNET_USE_POLLING_FILE_WATCHER=1" ` + -e "DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER=1" ` + $sdkImage ` + dotnet watch --project $projectPath run + +Write-Host "已启动。查看日志:docker logs -f $containerName" +Write-Host "Swagger:http://localhost:$hostPort/api/docs (兼容入口 /swagger)" +