TuyooSDKPackage/Packages/com.bywaystudios.tuyoosdk/Editor/iOS/EngineSdkConverterUtils.cs
2025-12-06 10:50:57 +08:00

160 lines
5.8 KiB
C#

using System;
using System.IO;
using UnityEditor;
using System.Diagnostics;
namespace EngineSdkConverter.Unity.Editor
{
public class Result
{
/// <summary>
/// Standard output stream from command line.
/// </summary>
public string StandardOutput;
/// <summary>
/// Standard error stream from command line.
/// </summary>
public string StandardError;
/// <summary>
/// Exit code returned from command line.
/// </summary>
public int ExitCode;
/// <summary>
/// The description of the result that can be used for error logging.
/// </summary>
public string Message;
}
public class EngineSdkConverterUtils
{
const string TAG = "EnginSdkConverterUtils ";
static public string GetFilePathByAssetName(string assetName)
{
var assetGuids = AssetDatabase.FindAssets(assetName);
string retPath = "";
foreach (var guid in assetGuids)
{
retPath = AssetDatabase.GUIDToAssetPath(guid);
if (File.Exists(retPath))
{
retPath = Path.Combine(retPath);
break;
}
else
{
retPath = "";
}
}
return retPath;
}
public static Result RunShell(string toolPath, string arguments, string workingDirectory)
{
var stdoutFileName = Path.GetTempFileName();
var stderrFileName = Path.GetTempFileName();
var process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.RedirectStandardInput = false;
process.StartInfo.RedirectStandardOutput = false;
process.StartInfo.RedirectStandardError = false;
process.StartInfo.EnvironmentVariables["LANG"] = "en_US.UTF-8";
process.StartInfo.EnvironmentVariables["PATH"] = $"{Environment.GetEnvironmentVariable("PATH")}:/usr/local/bin";
process.StartInfo.WorkingDirectory = workingDirectory;
process.StartInfo.FileName = "bash";
string argumentsFormat = string.Format("-l -c '\"{0}\" {1} 1> {2} 2> {3}'", toolPath, arguments, stdoutFileName, stderrFileName);
process.StartInfo.Arguments = argumentsFormat;
process.Start();
process.WaitForExit();
var stdout = File.ReadAllText(stdoutFileName);
var stderr = File.ReadAllText(stderrFileName);
File.Delete(stdoutFileName);
File.Delete(stderrFileName);
var result = new Result();
result.StandardOutput = stdout;
result.StandardError = stderr;
result.ExitCode = process.ExitCode;
var messagePrefix = result.ExitCode == 0 ? "Command executed successfully" : "Failed to run command";
result.Message = string.Format("{0}: '{1} {2}'\nstdout: {3}\nstderr: {4}\nExit code: {5}", messagePrefix, toolPath, arguments, stdout, stderr, process.ExitCode);
return result;
}
public static Result RunPython(string scriptPath, string arguments, string workingDirectory)
{
var stdoutFileName = Path.GetTempFileName();
var stderrFileName = Path.GetTempFileName();
var process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.RedirectStandardInput = false;
process.StartInfo.RedirectStandardOutput = false;
process.StartInfo.RedirectStandardError = false;
process.StartInfo.EnvironmentVariables["LANG"] = "en_US.UTF-8";
process.StartInfo.EnvironmentVariables["PATH"] = $"{Environment.GetEnvironmentVariable("PATH")}:/usr/local/bin";
process.StartInfo.WorkingDirectory = workingDirectory;
process.StartInfo.FileName = "bash";
// 直接调用 Python3 并保证参数安全
string argumentsFormat = $"-l -c 'python3 \"{scriptPath}\" {arguments} 1> \"{stdoutFileName}\" 2> \"{stderrFileName}\"'";
process.StartInfo.Arguments = argumentsFormat;
process.Start();
process.WaitForExit();
var stdout = File.ReadAllText(stdoutFileName);
var stderr = File.ReadAllText(stderrFileName);
File.Delete(stdoutFileName);
File.Delete(stderrFileName);
var result = new Result
{
StandardOutput = stdout,
StandardError = stderr,
ExitCode = process.ExitCode,
Message = $"{(process.ExitCode == 0 ? "Command executed successfully" : "Failed to run command")}: 'python3 {scriptPath} {arguments}'\nstdout: {stdout}\nstderr: {stderr}\nExit code: {process.ExitCode}"
};
return result;
}
public static void CopyDirectory(string sourceDir, string destDir, bool replace)
{
// 确保目标文件夹存在
if (!Directory.Exists(destDir))
{
Directory.CreateDirectory(destDir);
}
// 复制所有文件
foreach (var file in Directory.GetFiles(sourceDir))
{
string destFilePath = Path.Combine(destDir, Path.GetFileName(file));
File.Copy(file, destFilePath, replace); // true 表示覆盖已有文件
}
// 递归复制子文件夹
foreach (var subDir in Directory.GetDirectories(sourceDir))
{
string newDestDir = Path.Combine(destDir, Path.GetFileName(subDir));
CopyDirectory(subDir, newDestDir, replace);
}
}
}
}