feat: dev-services.py restart 命令新增热加载保护
- 无必须重启的变更时禁止 restart - 支持 --force 参数强制重启 - 避免无意义重启前端热加载服务
This commit is contained in:
@@ -75,6 +75,17 @@ FIXED_FRONTEND_PORTS = {
|
|||||||
"life-script": 5181,
|
"life-script": 5181,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 必须重启才能生效的文件模式
|
||||||
|
RESTART_REQUIRED_PATTERNS = [
|
||||||
|
re.compile(r'vite\.config\.(ts|js|mjs|cjs)$'),
|
||||||
|
re.compile(r'tsconfig\.json$'),
|
||||||
|
re.compile(r'\.env(\.[^/]*)?$'),
|
||||||
|
re.compile(r'package\.json$'),
|
||||||
|
re.compile(r'application.*\.ya?ml$'),
|
||||||
|
re.compile(r'pom\.xml$'),
|
||||||
|
re.compile(r'build\.gradle(\.kts)?$'),
|
||||||
|
]
|
||||||
|
|
||||||
# ANSI 颜色
|
# ANSI 颜色
|
||||||
COLORS = {
|
COLORS = {
|
||||||
"INFO": "\033[37m",
|
"INFO": "\033[37m",
|
||||||
@@ -402,6 +413,37 @@ def assign_unique_ports(services: list[Service]) -> list[Service]:
|
|||||||
return services
|
return services
|
||||||
|
|
||||||
|
|
||||||
|
def _should_restart_for_changes(service_dir: Path) -> tuple[bool, list[str]]:
|
||||||
|
"""
|
||||||
|
检查指定服务目录下是否有必须重启才能生效的变更。
|
||||||
|
返回: (是否需要重启, 已修改文件列表)
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
["git", "diff", "--name-only", "--", str(service_dir)],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
cwd=SCRIPT_DIR,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
changed_files = [line.strip() for line in result.stdout.splitlines() if line.strip()]
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
# 非 git 仓库或 git 命令失败,默认允许重启
|
||||||
|
return True, []
|
||||||
|
except FileNotFoundError:
|
||||||
|
return True, []
|
||||||
|
|
||||||
|
if not changed_files:
|
||||||
|
return False, []
|
||||||
|
|
||||||
|
for file_path in changed_files:
|
||||||
|
for pattern in RESTART_REQUIRED_PATTERNS:
|
||||||
|
if pattern.search(file_path):
|
||||||
|
return True, changed_files
|
||||||
|
|
||||||
|
return False, changed_files
|
||||||
|
|
||||||
|
|
||||||
def _extract_port_from_pom(pom_path: Path) -> Optional[int]:
|
def _extract_port_from_pom(pom_path: Path) -> Optional[int]:
|
||||||
"""从 pom.xml 提取 server.port"""
|
"""从 pom.xml 提取 server.port"""
|
||||||
try:
|
try:
|
||||||
@@ -1597,6 +1639,7 @@ def main():
|
|||||||
parser.add_argument("--type", dest="svc_type", default=None, help="服务类型过滤: vite|python|spring-boot|node-backend")
|
parser.add_argument("--type", dest="svc_type", default=None, help="服务类型过滤: vite|python|spring-boot|node-backend")
|
||||||
parser.add_argument("--port", dest="port", type=int, default=None, help="端口号过滤")
|
parser.add_argument("--port", dest="port", type=int, default=None, help="端口号过滤")
|
||||||
parser.add_argument("--foreground", "-f", action="store_true", help="前台模式运行")
|
parser.add_argument("--foreground", "-f", action="store_true", help="前台模式运行")
|
||||||
|
parser.add_argument("--force", action="store_true", help="强制重启,忽略热加载保护")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
@@ -1675,6 +1718,23 @@ def main():
|
|||||||
return
|
return
|
||||||
|
|
||||||
if args.action == "restart":
|
if args.action == "restart":
|
||||||
|
if not args.force:
|
||||||
|
blocked = []
|
||||||
|
for svc in services:
|
||||||
|
should_restart, changed_files = _should_restart_for_changes(svc.project_dir)
|
||||||
|
if not should_restart:
|
||||||
|
blocked.append((svc.name, changed_files))
|
||||||
|
|
||||||
|
if blocked:
|
||||||
|
log("检测到以下服务无需重启(当前修改支持热加载):", "WARN")
|
||||||
|
for name, files in blocked:
|
||||||
|
if files:
|
||||||
|
log(f" - {name}: 修改文件 {', '.join(files)}", "WARN")
|
||||||
|
else:
|
||||||
|
log(f" - {name}: 未检测到代码变更", "WARN")
|
||||||
|
log("如需强制重启,请使用: python dev-services.py restart --force", "WARN")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
for svc in services:
|
for svc in services:
|
||||||
restart_service(svc)
|
restart_service(svc)
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user