From ac84e5b5fc6d471909a79656716b6bc5013bd6c3 Mon Sep 17 00:00:00 2001 From: zhangaotian <8474238@qq.com> Date: Wed, 31 Jul 2024 16:37:34 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tool/BuildTool/blame.sh | 37 +++++++++++++++++++ Tool/BuildTool/build.sh | 29 ++++++++------- Tool/BuildTool/build_xcode.sh | 13 ++++--- Tool/BuildTool/build_xcode_xworkspace.sh | 23 ++++++++---- Tool/BuildTool/collect_and_send_error.sh | 17 +++++++-- Tool/BuildTool/project_env.sh | 28 ++++++++++++++ Tool/BuildTool/to_inner_wechat_robot.sh | 8 +++- Tool/BuildTool/to_outer_wechat_robot.sh | 10 ++++- Tool/BuildTool/update_build_resource_debug.sh | 10 ++++- Tool/BuildTool/upload_apk.sh | 18 +++++---- Tool/BuildTool/upload_ipa.sh | 18 +++++---- Tool/BuildTool/upload_to_server.sh | 21 +++++++---- 12 files changed, 176 insertions(+), 56 deletions(-) create mode 100644 Tool/BuildTool/blame.sh create mode 100644 Tool/BuildTool/project_env.sh mode change 100644 => 100755 Tool/BuildTool/to_inner_wechat_robot.sh mode change 100644 => 100755 Tool/BuildTool/update_build_resource_debug.sh mode change 100644 => 100755 Tool/BuildTool/upload_to_server.sh diff --git a/Tool/BuildTool/blame.sh b/Tool/BuildTool/blame.sh new file mode 100644 index 0000000..6adae20 --- /dev/null +++ b/Tool/BuildTool/blame.sh @@ -0,0 +1,37 @@ +#!/bin/bash +script_directory="$(cd "$(dirname "$0")" && pwd)" + +#if [ "$#" -eq 0 ]; then +# echo "Usage: $0 " +# exit 1 +#fi + +text="$1" + +#测试用 +#text="[Licensing::Client] Error: HandshakeResponse reported an error: +# Assets/Code/Scripts/Gameplay/UI/Shop/UI_ShopController.cs(94,77): error CS0117: 'SDKManager.SdkName' does not contain a definition for 'IAP' +# Assets/Code/Scripts/Gameplay/UI/Shop/UI_ShopController.cs(94,85): error CS0246: The type or namespace name 'IBuyServices' could not be found (are you missing a using directive or an assembly reference?) +# Assets/Code/Scripts/Gameplay/UI/Shop/UI_ShopController.cs(94,77): error CS0117: 'SDKManager.SdkName' does not contain a definition for 'IAP' +# Assets/Code/Scripts/Gameplay/UI/Shop/UI_ShopController.cs(94,85): error CS0246: The type or namespace name 'IBuyServices' could not be found (are you missing a using directive or an assembly reference?) +# Assets/Code/Scripts/Gameplay/UI/Shop/UI_ShopController.cs(94,77): error CS0117: 'SDKManager.SdkName' does not contain a definition for 'IAP' +# Assets/Code/Scripts/Gameplay/UI/Shop/UI_ShopController.cs(94,85): error CS0246: The type or namespace name 'IBuyServices' could not be found (are you missing a using directive or an assembly reference?) +# Scripts have compiler errors." + +echo "blame start $text" + +if [[ $text =~ (Assets\/[^:\(]+)\/([^:\(]+\.cs)[:\(]([0-9]+) ]]; then + path="${BASH_REMATCH[1]}" + fileName="${BASH_REMATCH[2]}" + line_number="${BASH_REMATCH[3]}" + echo "blame path:$path" + echo "blame file: $fileName" + echo "blame line_num: $line_number" + cd ../../ProjectNLD/"$path" || exit + #git blame -L "$line_number" "$fileName" + last_commit_author=$(git blame -L "$line_number" "$fileName" | sed 's/^[^(]*(\([^[:space:]]*\).*/\1/' | head -n 1) + message="fileName:$path/$fileName \r\n line_num:$line_number \r\n author:${last_commit_author}" + echo "message:$message" + cd "$script_directory" || exit + sh to_inner_wechat_robot.sh "$message" +fi \ No newline at end of file diff --git a/Tool/BuildTool/build.sh b/Tool/BuildTool/build.sh index cac15c0..c66e46d 100644 --- a/Tool/BuildTool/build.sh +++ b/Tool/BuildTool/build.sh @@ -9,6 +9,12 @@ if [ -f ./local_env.sh ]; then echo "found the local_env file" fi +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi + VERSION="$1" PROFILE="$2" ARTIFACT_URL="$3" @@ -18,20 +24,17 @@ CLEARCACHED="$6" DEVELPOMENT_BUILD="$7" CHANNEL="$8" AAB="$9" -PROJECTNAME="Forest" -echo "version="$VERSION", profile="$PROFILE", ARTIFACT_URL="$ARTIFACT_URL" , ENABLE_HOT_UPDATE="$ENABLE_HOT_UPDATE"" -echo "PLATFORM="$PLATFORM", CLEARCACHED="$CLEARCACHED", DEVELPOMENT_BUILD = "$DEVELPOMENT_BUILD"" -echo "AAB="$AAB"" - +echo "version="$VERSION", profile="$PROFILE", PLATFORM="$PLATFORM"" +echo "ARTIFACT_URL="$ARTIFACT_URL", ENABLE_HOT_UPDATE="$ENABLE_HOT_UPDATE"" +echo "CLEARCACHED="$CLEARCACHED", DEVELPOMENT_BUILD = "$DEVELPOMENT_BUILD"" +echo "AAB="$AAB", PROJECT_NAME="$PROJECT_NAME"" +echo "BUILD_NAME="$BUILD_NAME", APP_NAME="$APP_NAME"" # Set the build folder and name BUILD_FOLDER_FROM_ASSET="../Builds/$PLATFORM/$VERSION" #相对assets路径 BUILD_FOLDER="../../Builds/$PLATFORM/$VERSION" #相对脚本路径 -BUILD_NAME="ForestBuild" - -APP_NAME="Forest Journey" EXECUTE_METHOD="BatchBuild.BuildContentAndPlayer" LOG_FILE="$BUILD_FOLDER/build.log" # 相对脚本路径 @@ -40,7 +43,7 @@ EXECUTE_SETTING_METHOD="BatchBuild.ApplyPlayerSetting" echo "Start apply setting ... ... " -"$UNITY_PATH" -quit -batchmode -projectPath "../../$PROJECTNAME" -executeMethod "$EXECUTE_SETTING_METHOD" \ +"$UNITY_PATH" -quit -batchmode -projectPath "../../$PROJECT_NAME" -executeMethod "$EXECUTE_SETTING_METHOD" \ -platform "$PLATFORM" \ -appVersion "$VERSION" \ -buildName "$BUILD_NAME" \ @@ -55,7 +58,7 @@ echo "Start apply setting ... ... " echo "build folder is: "$BUILD_FOLDER" , log is : "$LOG_FILE" , Start building ... ... " -"$UNITY_PATH" -quit -batchmode -projectPath "../../$PROJECTNAME" -executeMethod "$EXECUTE_METHOD" \ +"$UNITY_PATH" -quit -batchmode -projectPath "../../$PROJECT_NAME" -executeMethod "$EXECUTE_METHOD" \ -platform "$PLATFORM" \ -appVersion "$VERSION" \ -buildName "$BUILD_NAME" \ @@ -72,12 +75,12 @@ echo "build folder is: "$BUILD_FOLDER" , log is : "$LOG_FILE" , Start building . build_result=$? if [ $build_result -ne 0 ]; then - echo "【"$PLATFORM"】【"$VERSION"】Unity build failed. Check the log for details." - sh to_inner_wechat_robot.sh "【$PLATFORM】【$VERSION】【$PROFILE】Failed to build" + echo "【$APP_NAME】【"$PLATFORM"】【"$VERSION"】 build failed. Check the log for details." + sh to_inner_wechat_robot.sh "【$APP_NAME】【$PLATFORM】【$VERSION】【$PROFILE】Failed to build" sh collect_and_send_error.sh $LOG_FILE exit 1 else - echo "【"$PLATFORM"】【"$VERSION"】Unity build successful." + echo "【$APP_NAME】【"$PLATFORM"】【"$VERSION"】Unity build successful." fi # upload remote resource to server diff --git a/Tool/BuildTool/build_xcode.sh b/Tool/BuildTool/build_xcode.sh index 737c52e..ea0332c 100644 --- a/Tool/BuildTool/build_xcode.sh +++ b/Tool/BuildTool/build_xcode.sh @@ -5,13 +5,17 @@ SHELL_DIR=$(dirname $0) echo "change dir to $SHELL_DIR" cd "$SHELL_DIR" +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi + PROJECT_NAME="$1" SCHEME_NAME="$2" PLATFORM="$3" VERSION="$4" -# Define variables -BUILD_NAME="AveryBuild" PROJECT_PATH="../../Builds/$PLATFORM/$VERSION/$BUILD_NAME/" #PROJECT_NAME="Unity-iPhone" # Replace with your Xcode project name (without the .xcodeproj extension) #SCHEME_NAME="Unity-iPhone" # Replace with your Xcode scheme @@ -40,9 +44,6 @@ xcodebuild -list -project $PROJECT_NAME.xcodeproj echo "clean..." xcodebuild clean - - - # Build the Xcode project and create an archive echo "Building Xcode project..." xcodebuild archive -project $PROJECT_NAME.xcodeproj -scheme $SCHEME_NAME -archivePath $OUTPUT_DIRECTORY/$PROJECT_NAME.xcarchive @@ -56,4 +57,4 @@ echo "Cleaning up temporary archive..." rm -rf $OUTPUT_DIRECTORY/$PROJECT_NAME.xcarchive # The script is now complete. -echo "Build process completed. IPA file is available at: $OUTPUT_DIRECTORY/YourProject.ipa" \ No newline at end of file +echo "Build process completed. IPA file is available at: $OUTPUT_DIRECTORY/$BUILD_NAME.ipa" diff --git a/Tool/BuildTool/build_xcode_xworkspace.sh b/Tool/BuildTool/build_xcode_xworkspace.sh index ae4204f..7b2f86b 100644 --- a/Tool/BuildTool/build_xcode_xworkspace.sh +++ b/Tool/BuildTool/build_xcode_xworkspace.sh @@ -5,16 +5,24 @@ SHELL_DIR=$(dirname $0) echo "change dir to $SHELL_DIR" cd "$SHELL_DIR" +if [ -f ./local_env.sh ]; then + source ./local_env.sh + echo "found the local_env file" +fi + +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi + PROJECT_NAME="$1" SCHEME_NAME="$2" PLATFORM="$3" VERSION="$4" -# Define variables -BUILD_NAME="ForestBuild" PROJECT_PATH="../../Builds/$PLATFORM/$VERSION/$BUILD_NAME/" -#PROJECT_NAME="Unity-iPhone" # Replace with your Xcode project name (without the .xcodeproj extension) -#SCHEME_NAME="Unity-iPhone" # Replace with your Xcode scheme + OUTPUT_DIRECTORY="../" # Replace with the desired output directory for the IPA file @@ -30,9 +38,8 @@ EXPORT_OPTIONS_FILE="./exportOptions.plist" PODFILE="./Podfile" PODFILE_LOCK="./Podfile.lock" -#Specify the full path to the pod command (modify as needed) -POD_PATH="/Users/mayuanzheng/.gem/ruby/3.0.0/bin/pod" - +#来自打包机 pod路径 +#POD_PATH="/Users/mayuanzheng/.gem/ruby/3.0.0/bin/pod" # Copy the file echo "copy export options to $PROJECT_PATH" @@ -75,4 +82,4 @@ echo "Cleaning up temporary archive..." rm -rf $OUTPUT_DIRECTORY/$PROJECT_NAME.xcarchive # The script is now complete. -echo "Build process completed. IPA file is available at: $OUTPUT_DIRECTORY/YourProject.ipa" \ No newline at end of file +echo "Build process completed. IPA file is available at: $OUTPUT_DIRECTORY/$BUILD_NAME.ipa" diff --git a/Tool/BuildTool/collect_and_send_error.sh b/Tool/BuildTool/collect_and_send_error.sh index 0ade5ca..33a26b9 100644 --- a/Tool/BuildTool/collect_and_send_error.sh +++ b/Tool/BuildTool/collect_and_send_error.sh @@ -1,16 +1,27 @@ #!/bin/bash -# Check if a filename is provided as an argument +#Check if a filename is provided as an argument if [ "$#" -eq 0 ]; then echo "Usage: $0 " exit 1 fi +echo"$0" + # Get the filename from the command line argument filename="$1" +exception=$(grep -A 12 "\[Build Exception\]:" "$filename") # Use grep to search for lines containing the word "error" -result=$(grep "error" "$filename") +error=$(grep "error" "$filename") + +echo "exception: $exception" +echo "error: $error" # Pass the result to another script -sh to_inner_wechat_robot.sh "$result" \ No newline at end of file +sh to_inner_wechat_robot.sh "$exception" +sh blame.sh "$exception" +sh to_inner_wechat_robot.sh "$error" +sh blame.sh "$error" + + diff --git a/Tool/BuildTool/project_env.sh b/Tool/BuildTool/project_env.sh new file mode 100644 index 0000000..587488e --- /dev/null +++ b/Tool/BuildTool/project_env.sh @@ -0,0 +1,28 @@ +#项目相关参数 + +# 打包文件名 +BUILD_NAME="ForestBuild" + +# App 名字 +APP_NAME="Forest Journey" + +# 项目名称 +PROJECT_NAME="Forest" + +# 服务器管理员 +REMOTE_USER="root" + +# 服务器地址 +REMOTE_HOST="132.232.113.98" + +# 服务器上传资源路径 +#REMOTE_UPLOAD_PATH="" + +# 内部机器人地址 +INNER_ROBOT="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3c92758c-1128-4931-ac8d-f19669d7befe" + +# 外部机器人地址 - PHXH +OUTER_ROBOT_PHXH="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=08abd6b7-67be-421b-8f9b-9bc1b2c71150" + +# 外部机器人地址 - NLD委员会 +OUTER_ROBOT_NLD="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=cc0e1316-dd10-4845-b067-5693f2385f66" diff --git a/Tool/BuildTool/to_inner_wechat_robot.sh b/Tool/BuildTool/to_inner_wechat_robot.sh old mode 100644 new mode 100755 index a274348..0f49835 --- a/Tool/BuildTool/to_inner_wechat_robot.sh +++ b/Tool/BuildTool/to_inner_wechat_robot.sh @@ -3,6 +3,12 @@ SHELL_DIR=$(dirname $0) echo "change dir to $SHELL_DIR" cd "$SHELL_DIR" +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi + # Check if exactly one arguments are provided if [ $# -ne 1 ]; then echo "Usage: $0 " @@ -13,4 +19,4 @@ fi MSG_TEXT="$1" echo "$MSG_TEXT" -sh to_wechat_robot.sh "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3c92758c-1128-4931-ac8d-f19669d7befe" "@all" "$MSG_TEXT" \ No newline at end of file +sh to_wechat_robot.sh "$INNER_ROBOT" "@all" "$MSG_TEXT" diff --git a/Tool/BuildTool/to_outer_wechat_robot.sh b/Tool/BuildTool/to_outer_wechat_robot.sh index 00e9a56..89dd3ce 100644 --- a/Tool/BuildTool/to_outer_wechat_robot.sh +++ b/Tool/BuildTool/to_outer_wechat_robot.sh @@ -3,6 +3,12 @@ SHELL_DIR=$(dirname $0) echo "change dir to $SHELL_DIR" cd "$SHELL_DIR" +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi + # Check if exactly one arguments are provided if [ $# -ne 1 ]; then echo "Usage: $0 " @@ -14,6 +20,6 @@ MSG_TEXT="$1" echo "$MSG_TEXT" # PHXH -sh to_wechat_robot.sh "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=08abd6b7-67be-421b-8f9b-9bc1b2c71150" "@all" "$MSG_TEXT" +sh to_wechat_robot.sh "$OUTER_ROBOT_PHXH" "@all" "$MSG_TEXT" # NLD委员会 -sh to_wechat_robot.sh "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=cc0e1316-dd10-4845-b067-5693f2385f66" "@all" "$MSG_TEXT" \ No newline at end of file +sh to_wechat_robot.sh "$OUTER_ROBOT_NLD" "@all" "$MSG_TEXT" diff --git a/Tool/BuildTool/update_build_resource_debug.sh b/Tool/BuildTool/update_build_resource_debug.sh old mode 100644 new mode 100755 index 9c2722e..1ac0d10 --- a/Tool/BuildTool/update_build_resource_debug.sh +++ b/Tool/BuildTool/update_build_resource_debug.sh @@ -9,6 +9,12 @@ if [ -f ./local_env.sh ]; then echo "found the local_env file" fi +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi + VERSION="$1" PLATFORM="$2" PROFILE="$3" @@ -27,9 +33,10 @@ LOG_FILE="$BUILD_FOLDER/UpdatePreviousBuild.log" #相对脚本路径 echo "Start update previous building ... ..." -"$UNITY_PATH" -quit -batchmode -projectPath "../../ProjectNLD" -executeMethod "$EXECUTE_METHOD" \ +"$UNITY_PATH" -quit -batchmode -projectPath "../../$PROJECT_NAME" -executeMethod "$EXECUTE_METHOD" \ -platform "$PLATFORM" \ -profile "$PROFILE" \ + -appVersion "$VERSION" \ -clearCached "$CLEARCACHED" \ -channel "$CHANNEL" \ -enableHotUpdate "$ENABLE_HOT_UPDATE" \ @@ -40,6 +47,7 @@ build_result=$? if [ $build_result -ne 0 ]; then echo "Update build failed. Check the log for details." sh to_inner_wechat_robot.sh "【$PLATFORM】【$VERSION】【$PROFILE】Failed to Update a previous build Addressable, Check the log for details:$ARTIFACT_URL" + sh collect_and_send_error.sh $LOG_FILE exit 1 else echo " Update a previous build successful! !" diff --git a/Tool/BuildTool/upload_apk.sh b/Tool/BuildTool/upload_apk.sh index 8e1026f..060300e 100644 --- a/Tool/BuildTool/upload_apk.sh +++ b/Tool/BuildTool/upload_apk.sh @@ -2,22 +2,26 @@ SHELL_DIR=$(dirname $0) echo "change dir to $SHELL_DIR" cd "$SHELL_DIR" -# Set remote server details (modify as needed) -REMOTE_USER="root" -REMOTE_HOST="132.232.113.98" +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi VERSION="$1" PLATFORM="$2" +WORKSPACE="$3" -APP_NAME="MyUnityBuild.apk" +APK_NAME="$BUILD_NAME.apk" -REMOTE_PATH="/var/www/html/nld/$PLATFORM/$VERSION/" +REMOTE_PATH="/$REMOTE_UPLOAD_PATH/$WORKSPACE/$PLATFORM/$VERSION/" +echo "upload folder is: ${REMOTE_PATH}" ssh "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_PATH" cd "../../Builds/$PLATFORM/$VERSION/" -scp "${APP_NAME}" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" +scp "${APK_NAME}" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" upload_result=$? @@ -27,4 +31,4 @@ if [ $upload_result -eq 0 ]; then else echo "Failed to upload apk to remote server." -fi \ No newline at end of file +fi diff --git a/Tool/BuildTool/upload_ipa.sh b/Tool/BuildTool/upload_ipa.sh index 5123c25..72411e4 100644 --- a/Tool/BuildTool/upload_ipa.sh +++ b/Tool/BuildTool/upload_ipa.sh @@ -2,16 +2,20 @@ SHELL_DIR=$(dirname $0) echo "change dir to $SHELL_DIR" cd "$SHELL_DIR" -# Set remote server details (modify as needed) -REMOTE_USER="root" -REMOTE_HOST="132.232.113.98" +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi VERSION="$1" PLATFORM="$2" +WORKSPACE="$3" -REMOTE_PATH="/var/www/html/nld/$PLATFORM/$VERSION/" +REMOTE_PATH="$REMOTE_UPLOAD_PATH/$WORKSPACE/$PLATFORM/$VERSION/" +echo "upload folder is: ${REMOTE_PATH}" -APP_NAME="MyUnityApp.ipa" +IAP_NAME="$BUILD_NAME.ipa" ssh "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_PATH" @@ -19,7 +23,7 @@ scp nld_self_host_ipa.plist "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" cd "../../Builds/$PLATFORM/$VERSION/" -scp "${APP_NAME}" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" +scp "${IAP_NAME}" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" upload_result=$? @@ -29,4 +33,4 @@ if [ $upload_result -eq 0 ]; then else echo "Failed to upload ipa to remote server." -fi \ No newline at end of file +fi diff --git a/Tool/BuildTool/upload_to_server.sh b/Tool/BuildTool/upload_to_server.sh old mode 100644 new mode 100755 index 3f94ae0..a814ec2 --- a/Tool/BuildTool/upload_to_server.sh +++ b/Tool/BuildTool/upload_to_server.sh @@ -9,23 +9,28 @@ if [ -f ./local_env.sh ]; then echo "found the local_env file" fi +# 获取项目相关参数 +if [ -f ./project_env.sh ]; then + source ./project_env.sh + echo "found the project_env file" +fi + VERSION="$1" PLATFORM="$2" WORKSPACE="$3" +NEWASSETS="$4" -# Set remote server details (modify as needed) -REMOTE_USER="root" -REMOTE_HOST="132.232.113.98" -REMOTE_PATH="/var/www/html/nld/$WORKSPACE/$PLATFORM/$VERSION" +REMOTE_PATH="/$REMOTE_UPLOAD_PATH/$WORKSPACE/$PLATFORM/$VERSION" echo "remote path : $REMOTE_PATH" # Set remote Build Path (local) (modify as needed) -BUILD_PATH="../../ProjectNLD/ServerData/$PLATFORM/" - -# Set the URL where you want to send the message -NOTE_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3c92758c-1128-4931-ac8d-f19669d7befe" +BUILD_PATH="../../$PROJECT_NAME/ServerData/$PLATFORM/" +# Check if NEWASSETS is true, if so, delete existing assets on remote server +#if [ "$NEWASSETS" = "true" ]; then +# ssh "$REMOTE_USER@$REMOTE_HOST" "rm -rf $REMOTE_PATH/*" +#fi tar -czvf upload.tgz -C "$BUILD_PATH" . ssh "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_PATH"