后继补充篇
最近需要写一个让策划远程打包unity的程序,就是策划只要在自己电脑发一条命令到服务端,然后服务端就会调用已经安装好的unity一键打包并上传到SVN,那么我们需要让自己写的程序处理完提交、解决冲突、处理删除文件等操作,于是乎DOS这种只是对SVN进行最简单的调用打开SVN界面去操作的话是很繁琐的。
我们需要直接调用SVN接口,我们可以借助SVN第三方包装库SharpSvn(C#)、svnkit(java),因为我用的是C#,所以下面是以SharpSvn为基础来写,首先先提供一些SharpSvn最基本的SVN操作。(注意,目标框架需要是Framework 2.0, 不然报错)
先添加引用SharpSvn.dll到项目,然后using SharpSvn就行了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
// 更新SVN
void
UpdateSvn
(
)
{
string
path
=
"D:\\Test"
;
SvnClient
client
=
new
SvnClient
(
)
;
client
.
Update
(
path
)
;
}
// 清理SVN
void
CleanSvn
(
)
{
string
path
=
"D:\\Test"
;
SvnClient
client
=
new
SvnClient
(
)
;
client
.
CleanUp
(
path
)
;
}
//提交SVN
void
CommitSvn
(
)
{
string
path
=
"D:\\Test"
;
SvnClient
client
=
new
SvnClient
(
)
;
SvnCommitArgs
comArgs
=
new
SvnCommitArgs
(
)
;
comArgs
.
LogMessage
=
"这里输入你的提交信息"
;
client
.
Commit
(
path
)
;
}
//处理有问题的文件
void
QuestionFile
(
)
{
string
path
=
"D:\\Test"
;
SvnClient
client
=
new
SvnClient
(
)
;
SvnStatusArgs
sa
=
new
SvnStatusArgs
(
)
;
Collection
<
SvnStatusEventArgs
>
status
;
client
.
GetStatus
(
path
,
sa
,
out
status
)
;
foreach
(
var
item
in
status
)
{
string
fPath
=
item
.
FullPath
;
if
(
item
.
LocalContentStatus
!=
item
.
RemoteContentStatus
)
{
//被修改了的文件
}
if
(
!
item
.
Versioned
)
{
//新增文件
client
.
Add
(
fPath
)
;
}
else
if
(
item
.
Conflicted
)
{
//将冲突的文件用工作文件解决冲突
client
.
Resolve
(
fPath
,
SvnAccept
.
Working
)
;
}
else
if
(
item
.
IsRemoteUpdated
)
{
//更新来自远程的新文件
client
.
Update
(
fPath
)
;
}
else
if
(
item
.
LocalContentStatus
==
SvnStatus
.
Missing
)
{
//删除丢失的文件
client
.
Delete
(
fPath
)
;
}
}
}
//获取SVN上最新150条的提交日志信息
string
GetSvnLog
(
)
{
string
path
=
"D:\\Test"
;
SvnClient
client
=
new
SvnClient
(
)
;
SvnLogArgs
logArgs
=
new
SvnLogArgs
(
)
;
logArgs
.
RetrieveAllProperties
=
false
;
//不检索所有属性
Collection
<
SvnLogEventArgs
>
status
;
client
.
GetLog
(
path
,
logArgs
,
out
status
)
;
int
messgNum
=
0
;
string
logText
=
""
;
string
lastLog
=
""
;
foreach
(
var
item
in
status
)
{
if
(
messgNum
>
150
)
break
;
messgNum
+=
1
;
if
(
string
.
IsNullOrEmpty
(
item
.
LogMessage
)
||
item
.
LogMessage
==
" "
||
lastLog
==
item
.
LogMessage
)
{
continue
;
}
logText
=
item
.
Author
+
":"
+
item
.
LogMessage
+
"\n"
+
logText
;
lastLog
=
item
.
LogMessage
;
}
return
logText
;
}
|
更详细的SharpSvn API文档:http://docs.sharpsvn.net/current/
以下是我当初参考的别人关于SharpSvn的栗子:
http://www.cnblogs.com/goody9807/archive/2012/11/01/2749938.html
http://www.cnblogs.com/lienhua34/p/3917787.html
http://www.cokco.cn/thread-414-1-1.html
扩展阅读
我们现在知道怎么用自己的程序调用SVN处理基本的操作了,但还需要很关键的一步,就是要让自己的程序去调用unity的打包函数,不过这一步很简单,unity有提供命令行的方式调用其内部所有编译好的函数(虽然也是用比较操蛋的DOS去实现,但事情先往简单的方法去做吧)。
1
2
3
4
|
string
unityPath
=
@"E:\unity4.6\Unity.exe"
;
//unity的位置
string
projectPaht
=
@"F:\Unity Project\Test"
;
//要打开的unity项目地址
string
funcName
=
"Build.BuildWindows"
;
//要调用的函数名字
System
.
Diagnostics
.
Process
.
Start
(
unityPath
,
@" -projectPath "
+
projectPaht
+
" -quit -batchmode -executeMethod "
+
funcName
)
;
|
更详细的关于untiy 的命令行参数:http://www.ceeger.com/Manual/CommandLineArguments.html