NLDClient-yudde/Tool/py_tools/PreHandle.py

255 lines
11 KiB
Python
Raw Permalink Normal View History

# 传入参数 0:SDK_PATH 1:ChannelPath 2:Obfuz(可选, true/false)
2025-07-25 14:38:13 +08:00
import sys
import os
2025-07-25 15:38:57 +08:00
import yaml
2025-07-25 14:38:13 +08:00
def main():
if len(sys.argv) < 3:
print("Usage: python PreHandle.py <SDK_PATH> <ChannelPath> [Obfuz]")
2025-07-25 14:54:48 +08:00
sys.exit(1) # 参数不足时返回错误码1
2025-07-25 14:38:13 +08:00
sdk_path = sys.argv[1]
channel_path = sys.argv[2]
obfuz = sys.argv[3].lower() == 'true' if len(sys.argv) >= 4 else None
2025-07-25 14:38:13 +08:00
if not os.path.exists(sdk_path):
print(f"Error: SDK path '{sdk_path}' does not exist.")
2025-07-25 14:54:48 +08:00
sys.exit(2) # SDK路径不存在时返回错误码2
2025-07-25 14:38:13 +08:00
if not os.path.exists(channel_path):
print(f"Error: Channel path '{channel_path}' does not exist.")
2025-07-25 14:54:48 +08:00
sys.exit(3) # Channel路径不存在时返回错误码3
2025-07-25 14:38:13 +08:00
# 这里可以添加更多的处理逻辑
print(f"SDK Path: {sdk_path}")
print(f"Channel Path: {channel_path}")
2025-07-25 15:38:57 +08:00
# 读取Channel Path/ChannelSetting.yaml
channelSettingPath = os.path.join(channel_path, "ChannelSetting.yaml")
if not os.path.exists(channelSettingPath):
print(f"Error: Channel setting file '{channelSettingPath}' does not exist.")
sys.exit(4) # Channel设置文件不存在时返回错误码4
with open(channelSettingPath, 'r', encoding='utf-8') as file:
channel_setting = file.read()
print(f"Channel Setting: {channel_setting}")
# 使用yaml解析
try:
channel_data = yaml.safe_load(channel_setting)
print(f"Parsed Channel Data: {channel_data}")
except yaml.YAMLError as e:
print(f"Error parsing YAML: {e}")
sys.exit(5)
# 检查Packages是否存在
# 这里假设Packages是一个列表 内容是 packageName@version
# 例如: ["package1@1.0.0", "package2@latest"]
packageList = channel_data.get("Packages", [])
if not packageList:
2025-07-25 16:48:01 +08:00
print("Info: PackageList is empty or not found in ChannelSetting.yaml.")
# 如果PackageList为空,则不处理
return
2025-07-25 15:38:57 +08:00
for package in packageList:
HandlePackage(package, sdk_path, channel_path)
# 同步 USE_OBFUZ 宏(如果传入了 Obfuz 参数)
if obfuz is not None:
SyncUseObfuzDefine(channel_path, obfuz)
2025-07-25 15:38:57 +08:00
# 处理完成,正常退出
print("All packages processed successfully.")
sys.exit(0) # 改为成功退出
def SyncUseObfuzDefine(channel_path, enable):
"""根据 enable 参数在 ChannelSetting.yaml 的 Define_list 中添加或移除 USE_OBFUZ"""
channel_setting_path = os.path.join(channel_path, "ChannelSetting.yaml")
if not os.path.exists(channel_setting_path):
print(f"[PreHandle] WARNING: ChannelSetting.yaml not found at {channel_setting_path}, skip USE_OBFUZ sync")
return
try:
with open(channel_setting_path, 'r', encoding='utf-8') as f:
data = yaml.safe_load(f) or {}
except (IOError, yaml.YAMLError) as e:
print(f"[PreHandle] ERROR: Failed to read ChannelSetting.yaml: {e}")
return
defines = data.get('Define_list') or []
changed = False
if enable:
if 'USE_OBFUZ' not in defines:
defines.append('USE_OBFUZ')
data['Define_list'] = defines
changed = True
print('[PreHandle] Added USE_OBFUZ to Define_list')
else:
print('[PreHandle] USE_OBFUZ already in Define_list, skip')
else:
if 'USE_OBFUZ' in defines:
defines.remove('USE_OBFUZ')
data['Define_list'] = defines
changed = True
print('[PreHandle] Removed USE_OBFUZ from Define_list')
else:
print('[PreHandle] USE_OBFUZ not in Define_list, skip')
if changed:
try:
with open(channel_setting_path, 'w', encoding='utf-8') as f:
yaml.dump(data, f, allow_unicode=True)
except IOError as e:
print(f"[PreHandle] ERROR: Failed to write ChannelSetting.yaml: {e}")
2025-07-25 15:38:57 +08:00
def HandlePackage(packageDefineName, sdk_path, channel_path):
# 处理包定义名称
if '@' not in packageDefineName:
print(f"Error: Invalid package format '{packageDefineName}'. Expected format 'packageName@version'.")
sys.exit(8) # 返回错误码8
packageName, version = packageDefineName.split('@', 1)
2025-07-25 18:15:44 +08:00
print(f"Start Handle Package Name: {packageName}, Version: {version}")
2025-07-25 15:38:57 +08:00
# 检查sdk_path/packageName 是否存在
package_path = os.path.join(sdk_path, packageName)
if not os.path.exists(package_path):
print(f"Error: Package path '{package_path}' does not exist.")
sys.exit(7) # 包路径不存在时返回错误码7
# 如果version是latest, 则读取package_path/latest.txt
if version == "latest":
latest_file_path = os.path.join(package_path, "latest.txt")
if not os.path.exists(latest_file_path):
print(f"Error: Latest file '{latest_file_path}' does not exist.")
sys.exit(9)
2025-07-25 16:16:30 +08:00
with open(latest_file_path, 'r', encoding='utf-8') as file:
2025-07-25 15:38:57 +08:00
latest_version = file.read().strip()
print(f"Latest Version: {latest_version}")
version = latest_version # 添加这行更新version变量
#判断package_path/version文件夹是否存在
version_path = os.path.join(package_path, version)
if not os.path.exists(version_path):
print(f"Error: Version path '{version_path}' does not exist.")
sys.exit(10)
# 把version_path/Assets下所有的文件和文件夹复制到channel_path/Assets
srcAssetPath = os.path.join(version_path, "Assets")
targetAssetPath = os.path.join(channel_path, "Assets")
CopyAssets(srcAssetPath, targetAssetPath)
2025-07-25 16:16:30 +08:00
ModifyDefineList(version_path, channel_path)
2025-07-25 15:38:57 +08:00
2025-07-25 16:16:30 +08:00
def ModifyDefineList(versionPath, channel_path):
2025-07-25 15:38:57 +08:00
# 读取versionPath/OtherConfig.yaml
other_config_path = os.path.join(versionPath, "OtherConfig.yaml")
if not os.path.exists(other_config_path):
print(f"Info: OtherConfig file '{other_config_path}' does not exist.")
return
2025-07-25 16:16:30 +08:00
try:
with open(other_config_path, 'r', encoding='utf-8') as file:
other_config = yaml.safe_load(file)
print(f"Other Config: {other_config}")
except (IOError, yaml.YAMLError) as e:
print(f"Error reading OtherConfig file '{other_config_path}': {e}")
return
2025-07-25 15:38:57 +08:00
# 检查是否有DefineList
define_list = other_config.get("Define_list", [])
if not define_list:
print("Info: Define_list is empty or not found in OtherConfig.yaml.")
return
2025-07-25 16:16:30 +08:00
2025-07-25 15:38:57 +08:00
# 修改channel_path/ChannelSetting.yaml中的DefineList
channel_setting_path = os.path.join(channel_path, "ChannelSetting.yaml")
if not os.path.exists(channel_setting_path):
print(f"Error: Channel setting file '{channel_setting_path}' does not exist.")
sys.exit(11)
2025-07-25 16:16:30 +08:00
try:
with open(channel_setting_path, 'r', encoding='utf-8') as file:
channel_setting = yaml.safe_load(file)
2025-07-25 18:15:44 +08:00
# print(f"Channel Setting Before Modification: {channel_setting}")
2025-07-25 16:16:30 +08:00
except (IOError, yaml.YAMLError) as e:
print(f"Error reading channel setting file '{channel_setting_path}': {e}")
sys.exit(11)
2025-07-25 18:15:44 +08:00
print(f"Old Define_List: {channel_setting.get('Define_list', [])}")
2025-07-25 16:16:30 +08:00
2025-07-25 18:15:44 +08:00
# 修改DefineList添加去重功能
# 注意Define_list 可能不存在,或存在但值为 NoneYAML 中写了 key 但没有值)
if not channel_setting.get("Define_list"):
2025-07-25 15:38:57 +08:00
channel_setting["Define_list"] = []
2025-07-25 18:15:44 +08:00
# 合并并去重
current_defines = set(channel_setting["Define_list"])
new_defines = set(define_list)
# 输出将要添加的新定义
added_defines = new_defines - current_defines
if added_defines:
print(f"Adding new defines: {list(added_defines)}")
# 重复项警告
duplicate_defines = new_defines & current_defines
if duplicate_defines:
print(f"Warning: Duplicate defines found and will be ignored: {list(duplicate_defines)}")
# 更新定义列表(保持原有顺序,添加新项)
channel_setting["Define_list"] = list(current_defines | new_defines)
2025-07-25 16:16:30 +08:00
try:
with open(channel_setting_path, 'w', encoding='utf-8') as file:
yaml.dump(channel_setting, file, allow_unicode=True)
2025-07-25 18:15:44 +08:00
# print(f"Channel Setting After Modification: {channel_setting}")
2025-07-25 16:16:30 +08:00
except IOError as e:
print(f"Error writing channel setting file '{channel_setting_path}': {e}")
sys.exit(15)
2025-07-25 15:38:57 +08:00
2025-07-25 18:15:44 +08:00
print(f"New Define_List: {channel_setting['Define_list']}")
2025-07-25 15:38:57 +08:00
def CopyAssets(srcAssetPath, targetAssetPath):
# 如果srcAssetPath不存在,则返回
if not os.path.exists(srcAssetPath):
print(f"Info: Source asset path '{srcAssetPath}' does not exist.")
return
# 如果targetAssetPath不存在,则创建
if not os.path.exists(targetAssetPath):
try:
os.makedirs(targetAssetPath)
2025-07-25 17:30:11 +08:00
# print(f"Created target asset path: {targetAssetPath}")
2025-07-25 15:38:57 +08:00
except OSError as e:
print(f"Error: Failed to create directory '{targetAssetPath}': {e}")
sys.exit(12)
2025-07-25 16:55:47 +08:00
2025-07-25 18:15:44 +08:00
# print(f"Start copying assets from '{srcAssetPath}' to '{targetAssetPath}'")
2025-07-25 15:38:57 +08:00
# 遍历srcAssetPath下的所有文件和文件夹
try:
for item in os.listdir(srcAssetPath):
src_item_path = os.path.join(srcAssetPath, item)
target_item_path = os.path.join(targetAssetPath, item)
# 如果是文件,则复制
if os.path.isfile(src_item_path):
2025-07-25 16:55:47 +08:00
# 检查目标文件是否已存在,如果存在则输出警告
if os.path.exists(target_item_path):
print(f"Warning: Target file '{target_item_path}' already exists and will be overwritten.")
2025-07-25 15:38:57 +08:00
try:
with open(src_item_path, 'rb') as src_file:
with open(target_item_path, 'wb') as target_file:
target_file.write(src_file.read())
2025-07-25 16:55:47 +08:00
# print(f"Copied file: {src_item_path} to {target_item_path}")
2025-07-25 15:38:57 +08:00
except IOError as e:
print(f"Error: Failed to copy file '{src_item_path}': {e}")
sys.exit(13)
# 如果是文件夹,则递归调用CopyAssets
elif os.path.isdir(src_item_path):
2025-07-25 16:55:47 +08:00
# 检查目标目录是否已存在,如果存在则输出警告
if os.path.exists(target_item_path):
print(f"Warning: Target directory '{target_item_path}' already exists, merging contents.")
2025-07-25 15:38:57 +08:00
CopyAssets(src_item_path, target_item_path)
except OSError as e:
print(f"Error: Failed to list directory '{srcAssetPath}': {e}")
sys.exit(14)
2025-07-25 14:54:48 +08:00
2025-07-25 17:30:11 +08:00
# print(f"Assets copied successfully from '{srcAssetPath}' to '{targetAssetPath}'")
2025-07-25 16:55:47 +08:00
2025-07-25 14:54:48 +08:00
if __name__ == "__main__":
main()