其实之前有过一篇关于SVN更新的,但那是在Windows上的,Windows上bat之后也没有用,用的是小乌龟工具。用了一年多没啥大问题。现在来写Mac的主要是本人在用Mac的SVN更新的时候,有点累,一直用命令行更新,写烦了cd xxx,然后svn update,再接着svn revert --depth=infinity .这些命令。

也用过一些SVN工具,Mac上好像没啥好的工具,没有小乌龟的过滤更新功能(主要是AB包是在Window上打,Mac上是直接打ipa,不需要更新某些目录),那些工具对我来说跟输入命令行也没啥区别。因此写了个简单的SVN工具。大致实现了两种方式,最后还是选择第一种。其实两种方式都是类似的,只是输出不一样,一个输出在Unity的Console,另一个则是输出在Terminal。

先来说第一种:

先写个sh脚本:svnupdate.sh

#!/bin/bashtempProjectDirectory=$*echo "${tempProjectDirectory}"# 需要更新的目录
updatePath[0]="${tempProjectDirectory}""/Assets/Editor"
updatePath[1]="${tempProjectDirectory}""/Assets/IngameDebugConsole"
updatePath[2]="${tempProjectDirectory}""/Assets/Midas"
updatePath[3]="${tempProjectDirectory}""/Assets/Msdk"
updatePath[4]="${tempProjectDirectory}""/Assets/Plugins"
updatePath[5]="${tempProjectDirectory}""/Assets/PostProcessing"
updatePath[6]="${tempProjectDirectory}""/Assets/Resources/chuangjue"
updatePath[7]="${tempProjectDirectory}""/Assets/Scripts"
updatePath[8]="${tempProjectDirectory}""/Assets/StreamingAssets/iOS"
updatePath[9]="${tempProjectDirectory}""/Assets/TextMesh Pro"
updatePath[10]="${tempProjectDirectory}""/PlatformSDKPlugin"
updatePath[11]="${tempProjectDirectory}""/ProjectSettings"
updatePath[12]="${tempProjectDirectory}""/Shell"for var in "${updatePath[@]}";
doecho "Now is updating ""${var}"# 判断目录是否存在if [ -d "${var}" ]; thencd "${var}"svn update --accept theirs-fullfi
doneecho "svn update finish"

然后在之前的c#代码上进行修改:

    /// <summary>/// 调用小乌龟SVN/// </summary>/// <param name="commandType"></param>/// <param name="path"></param>private static void SVNCommandAndRun(SVN_COMMAND_TYPE commandType, string path = null){
#if UNITY_EDITOR_WINWindowCMD(commandType, path);
#elif UNITY_EDITOR_OSXMacCMD(commandType, path);
#endif}private static void MacCMD(SVN_COMMAND_TYPE commandType, string path = null){// Application.dataPath 只能在主线程中获取int lastIndex = Application.dataPath.LastIndexOf("/");string sourcePath = Application.dataPath.Substring(0, lastIndex);// 获取sh文件存放目录string shellCmd = sourcePath + "/Shell/";switch (commandType){case SVN_COMMAND_TYPE.UPDATE:shellCmd += "svnupdate.sh " + sourcePath;break;case SVN_COMMAND_TYPE.REVERT:shellCmd += "svnrevert.sh " + sourcePath;break;}UnityEngine.Debug.Log("shellCmd: " + shellCmd);// 新开线程防止锁死Thread newThread = new Thread(new ParameterizedThreadStart(SVNCmdThread));newThread.Start(shellCmd);}private static void WindowCMD(SVN_COMMAND_TYPE commandType, string path = null){#region 拼接小乌龟svn命令string command = "TortoiseProc.exe /command:";switch (commandType){case SVN_COMMAND_TYPE.UPDATE:command += "update /path:\"";break;case SVN_COMMAND_TYPE.COMMIT:command += "commit /path:\"";break;case SVN_COMMAND_TYPE.REVERT:command += "revert /path:\"";break;case SVN_COMMAND_TYPE.CLEANUP:command += "cleanup /path:\"";break;case SVN_COMMAND_TYPE.LOG:default:command += "log /path:\"";break;}if (path == null || path == ""){command += Application.dataPath;command = command.Substring(0, command.Length - 6);}elsecommand += path;command += "\"";command += " /closeonend:0";//UnityEngine.Debug.LogError("command: " + command);#endregion// 新开线程防止锁死Thread newThread = new Thread(new ParameterizedThreadStart(SVNCmdThread));newThread.Start(command);}private static void SVNCmdThread(object obj){Process p = new Process();
#if UNITY_EDITOR_WINp.StartInfo.FileName = "cmd.exe";//UnityEngine.Debug.LogError("command: " + obj.ToString());p.StartInfo.Arguments = "/c " + obj.ToString();
#elif UNITY_EDITOR_OSXp.StartInfo.FileName = "/bin/bash";p.StartInfo.Arguments = obj.ToString();
#endifp.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardInput = true;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.RedirectStandardError = true;p.StartInfo.CreateNoWindow = true;p.Start();while (!p.StandardOutput.EndOfStream){UnityEngine.Debug.Log(p.StandardOutput.ReadLine());}p.WaitForExit();p.Close();}

效果如下:

第二种方式和第一种类似,实际上也是用到了sh脚本,直接看代码:

    private static void MacCMD(SVN_COMMAND_TYPE commandType, string path = null){// Application.dataPath 只能在主线程中获取int lastIndex = Application.dataPath.LastIndexOf("/");string sourcePath = Application.dataPath.Substring(0, lastIndex);// 获取sh文件存放目录string shellPath = sourcePath + "/Shell/";switch (commandType){case SVN_COMMAND_TYPE.UPDATE:shellPath += "svnupdate.sh";break;case SVN_COMMAND_TYPE.REVERT:shellPath += "svnrevert.sh";break;}string argument = shellPath + "|" + sourcePath;UnityEngine.Debug.Log("shellCmd: " + argument);// 新开线程防止锁死Thread newThread = new Thread(new ParameterizedThreadStart(MacSVNCmdThread));newThread.Start(argument);}private static void MacSVNCmdThread(object obj){try{var argument = obj.ToString();var strArray = argument.Split('|');var shellPath = strArray[0];var sourcePath = strArray[1];if (File.Exists(shellPath))File.Delete(shellPath);StreamWriter sw = new StreamWriter(shellPath, false, System.Text.Encoding.UTF8);sw.WriteLine("#!/bin/sh");sw.WriteLine("tempProjectDirectory=" + sourcePath);sw.WriteLine("echo $tempProjectDirectory");sw.WriteLine("cd $tempProjectDirectory");sw.WriteLine("svn update");sw.WriteLine("svn revert --depth=infinity .");sw.WriteLine("exit");sw.Close();Process chmod = new Process();chmod.StartInfo.FileName = @"/bin/bash";chmod.StartInfo.Arguments = string.Format("-c \"chmod 777 {0}\"", shellPath);chmod.StartInfo.UseShellExecute = false;chmod.StartInfo.CreateNoWindow = true;chmod.Start();chmod.WaitForExit();Process svnProcess = new Process();svnProcess.StartInfo.FileName = @"/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal";svnProcess.StartInfo.Arguments = shellPath;svnProcess.StartInfo.UseShellExecute = false;svnProcess.StartInfo.CreateNoWindow = true;svnProcess.Start();svnProcess.WaitForExit(); svnProcess.Close();}catch(Exception e){UnityEngine.Debug.LogError("MacSVNCmdThread: " + e.ToString());}}

跟第一种很类似吧,就是动态创建sh,修改sh脚本属性,改成可读,可写和可执行,再调用Mac的控制台来执行sh脚本。只写了个简单的SVN Update的,因为没有满足自己的需要,弃用了,因为会卡进程,需要自己手动关闭Mac的控制台。其实这种方式还有其他问题,不会自动关闭控制台,通过偏好设置可以设置,但还是需要手动关闭,没有达到自己的需求,还有就是弹出的控制台不在Unity窗口前。效果如下:

在研究这玩意的时候,随便看了下bat的数组处理方式,相对来说,还是shell简单点:

@echo off:: 第一种数组实现方式
set array="Array_0" "Array_1" "Array_2":: 第二种数组实现方式
rem set array="Array_0"
rem set array=%array%;"Array_1"
rem set array=%array%;"Array_2"(for %%b in (%array%) do (echo %%b
))set list=1 2 3 4
(for %%a in (%list%) do ( echo %%a
))pause
exit

[Unity]Mac调用SVN更新相关推荐

  1. PHP中调用SVN命令更新网站方法(解决文件名包含中文更新失败的问题)

    想说写一个通过网页就可以执行 SVN 升级的程序,结果并不是我想得那样简单,有一些眉角需要注意的说. 先以 Apache 的用户帐号执行 SVN checkout,这样 Apache 才有 SVN 的 ...

  2. Unity代码调用网络摄像头WebCamTexture

    Unity代码调用网络摄像头WebCamTexture 初始代码 后续功能&代码更新 注意事项 初始代码 编辑器模式或Android环境和实机测试都没有问题. using System.Col ...

  3. [Unity脚本运行时更新]C#7.3新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第8篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  4. [Unity脚本运行时更新]C#7.2新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第7篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  5. [Unity脚本运行时更新]C#7新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第5篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  6. [Unity脚本运行时更新]C#6新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第4篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  7. [Unity脚本运行时更新]C#5新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第3篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  8. [Unity脚本运行时更新]C#4新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第2篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  9. Unity脚本运行时更新带来了什么?

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第一篇,后续会结合Unity实例介绍C# 4 - C# 6都带来了具体哪些变化 ...

最新文章

  1. 【Python 爬虫】 2、HTTP基本原理
  2. java构造函数调用其他程序的顺序_java初始化构造函数调用顺序
  3. Twitter Storm安装配置(Ubuntu系统)单机版
  4. c语言消去法解线性方程组,高斯消元法解线性方程组(C++实现)
  5. careercup-链表 2.4
  6. PrizmDoc HTML5文档查看器和Web API
  7. 90后程序员程广坤教你零基础自学编程,用这6种方法就够了!
  8. 游戏开发需要懂几种语言?
  9. Fluentd日志采集使用教程
  10. 天津美术学院2021级专升本新生报到前后相关要求
  11. FPGA结构分析——IDELAY2,网口储备点3
  12. vue 控制某个元素的显示或者隐藏之v-if属性
  13. 寻找我心中的产品经理
  14. ad账户与linux集成,Ubuntu 通过ldap集成AD账号登录(nslcd方式)
  15. JAVA实现雪花飘落动画效果
  16. Modern C++ 学习笔记——C++函数式编程
  17. 日语学习不错的资料下载
  18. 云计算行业现状及未来发展趋势
  19. 51红外发射数字信号程序讲解
  20. Linux 系统调用的执行过程

热门文章

  1. 拉钩教育高薪训练营学习笔记
  2. esp32 wifi 连接
  3. 系统架构师----笔记
  4. (纪中)1593. 【GDKOI训练】电视游戏问题(vidgame)【DP】
  5. 精通特征工程 —— 2.简单得数字奇特技巧
  6. minpack.error: Result from function call is not a proper array of floats.
  7. 通过面试谈谈自己的一点感悟(只是个人的一点拙见)
  8. 怎么制作微信gif表情?这几个方法简单好用
  9. 界面控件BCGControlBar for .NET v7.1正式发布——支持VS 2022
  10. 基于ssm+mysql的javaee微博博客系统,Java实现类似新浪微博网站、朋友圈分享系统