pindo 5.13.7 → 5.13.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/pindo/base/git_handler.rb +247 -42
- data/lib/pindo/command/android/autobuild.rb +104 -31
- data/lib/pindo/command/android/autoresign.rb +23 -322
- data/lib/pindo/command/android/keystore.rb +7 -130
- data/lib/pindo/command/appstore/adhocbuild.rb +52 -15
- data/lib/pindo/command/appstore/autobuild.rb +104 -8
- data/lib/pindo/command/appstore/autoresign.rb +3 -5
- data/lib/pindo/command/ios/autobuild.rb +96 -32
- data/lib/pindo/command/ios/build.rb +8 -186
- data/lib/pindo/command/jps/media.rb +146 -0
- data/lib/pindo/command/jps/upload.rb +49 -21
- data/lib/pindo/command/jps.rb +1 -0
- data/lib/pindo/command/unity/autobuild.rb +141 -32
- data/lib/pindo/command/unity/packpush.rb +5 -8
- data/lib/pindo/command/utils/repoinit.rb +0 -2
- data/lib/pindo/command/utils/tag.rb +58 -26
- data/lib/pindo/command/utils.rb +0 -1
- data/lib/pindo/command/web/autobuild.rb +98 -34
- data/lib/pindo/command.rb +0 -56
- data/lib/pindo/config/build_info_manager.rb +7 -8
- data/lib/pindo/module/android/android_config_helper.rb +2 -11
- data/lib/pindo/module/appselect.rb +15 -41
- data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
- data/lib/pindo/module/build/build_helper.rb +28 -18
- data/lib/pindo/module/build/git_repo_helper.rb +284 -405
- data/lib/pindo/module/cert/pem_helper.rb +3 -6
- data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
- data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
- data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
- data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
- data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
- data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
- data/lib/pindo/module/task/model/build_task.rb +8 -11
- data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
- data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
- data/lib/pindo/module/task/model/git_task.rb +75 -0
- data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
- data/lib/pindo/module/task/model/{jps_resign_task.rb → jps/jps_resign_task.rb} +14 -23
- data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
- data/lib/pindo/module/task/model/{jps_upload_task.rb → jps/jps_upload_task.rb} +39 -94
- data/lib/pindo/module/task/model/jps_task.rb +43 -0
- data/lib/pindo/module/task/model/{ipa_local_resign_task.rb → resign/ipa_local_resign_task.rb} +7 -2
- data/lib/pindo/module/task/model/unity/unity_config_task.rb +103 -0
- data/lib/pindo/module/task/model/{unity_export_task.rb → unity/unity_export_task.rb} +76 -78
- data/lib/pindo/module/task/model/unity/unity_update_task.rb +95 -0
- data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +156 -0
- data/lib/pindo/module/task/model/unity_task.rb +118 -0
- data/lib/pindo/module/task/pindo_task.rb +101 -1
- data/lib/pindo/module/task/task_manager.rb +29 -24
- data/lib/pindo/module/unity/nuget_helper.rb +7 -7
- data/lib/pindo/module/unity/unity_command_helper.rb +188 -0
- data/lib/pindo/module/unity/unity_env_helper.rb +208 -0
- data/lib/pindo/module/unity/unity_helper.rb +189 -746
- data/lib/pindo/module/unity/unity_proc_helper.rb +390 -0
- data/lib/pindo/options/core/global_options_state.rb +96 -26
- data/lib/pindo/options/core/option_configuration.rb +3 -0
- data/lib/pindo/options/core/option_item.rb +36 -0
- data/lib/pindo/options/groups/build_options.rb +23 -6
- data/lib/pindo/options/groups/git_options.rb +115 -0
- data/lib/pindo/options/groups/jps_options.rb +7 -0
- data/lib/pindo/options/groups/option_group.rb +15 -0
- data/lib/pindo/options/groups/unity_options.rb +49 -0
- data/lib/pindo/options/options.rb +2 -0
- data/lib/pindo/version.rb +2 -2
- metadata +25 -14
- data/lib/pindo/base/githelper.rb +0 -686
- data/lib/pindo/base/pindocontext.rb +0 -602
- data/lib/pindo/command/utils/feishu.rb +0 -134
- data/lib/pindo/module/build/version_helper.rb +0 -146
- data/lib/pindo/module/task/model/git_tag_task.rb +0 -80
|
@@ -1,61 +1,54 @@
|
|
|
1
|
-
|
|
1
|
+
require 'pindo/module/task/model/unity_task'
|
|
2
2
|
require 'pindo/base/funlog'
|
|
3
3
|
|
|
4
4
|
module Pindo
|
|
5
5
|
module TaskSystem
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
# Unity 导出任务
|
|
7
|
+
# 用于将 Unity 项目导出为指定平台(iOS/Android/WebGL)
|
|
8
|
+
class UnityExportTask < UnityTask
|
|
9
|
+
attr_reader :platform, :export_path, :deploy_mode, :is_library_mode
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
# 任务键
|
|
12
|
+
def self.task_key
|
|
10
13
|
:unity_export
|
|
11
14
|
end
|
|
12
15
|
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
2 # 可以重试 2 次
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def self.default_retry_delay
|
|
23
|
-
10 # 延迟 10 秒
|
|
24
|
-
end
|
|
25
|
-
|
|
16
|
+
# @param platform [String] 目标平台 ('ios', 'android', 'web')
|
|
17
|
+
# @param options [Hash] 额外选项
|
|
18
|
+
# - :project_path [String] Unity 项目路径(默认当前目录)
|
|
19
|
+
# - :export_path [String] 导出路径(nil 表示自动检测)
|
|
20
|
+
# - :deploy_mode [String] 部署模式 ('dev', 'adhoc', 'release'),默认 'dev'
|
|
21
|
+
# - :context [Hash] 上下文信息(如 index_count)
|
|
26
22
|
def initialize(platform, options = {})
|
|
27
23
|
@platform = platform
|
|
28
|
-
@unity_project_path = options[:project_path] || Dir.pwd
|
|
29
24
|
@unity_exe_path = nil # 将在 do_work 中自动查找
|
|
30
|
-
@
|
|
31
|
-
@is_library_mode = false # 不再支持库模式
|
|
25
|
+
@is_library_mode = false
|
|
32
26
|
@index_count = options[:context] ? options[:context][:index_count] : nil
|
|
33
27
|
@export_path = options[:export_path] # 可由参数传入,nil 表示自动检测
|
|
34
28
|
@deploy_mode = options[:deploy_mode] || 'dev' # 部署模式:dev/adhoc/release,默认 dev
|
|
35
29
|
|
|
36
30
|
name = case platform
|
|
37
31
|
when 'ios', 'ipa'
|
|
38
|
-
"Unity
|
|
32
|
+
"Unity导出iOS平台"
|
|
39
33
|
when 'android', 'apk'
|
|
40
|
-
"Unity
|
|
34
|
+
"Unity导出Android平台"
|
|
41
35
|
when 'web', 'html'
|
|
42
|
-
"Unity
|
|
36
|
+
"Unity导出WebGL平台"
|
|
43
37
|
else
|
|
44
|
-
"Unity
|
|
38
|
+
"Unity导出#{platform.upcase}平台"
|
|
45
39
|
end
|
|
46
40
|
|
|
41
|
+
# 传递 project_path 给基类
|
|
42
|
+
options[:project_path] ||= Dir.pwd
|
|
47
43
|
super(name, options)
|
|
48
44
|
end
|
|
49
45
|
|
|
50
46
|
def validate
|
|
51
|
-
|
|
52
|
-
unless @unity_helper
|
|
53
|
-
@unity_helper = Pindo::Client::UnityHelper.share_instance
|
|
54
|
-
end
|
|
47
|
+
super
|
|
55
48
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
# 验证 Unity 工程是否存在
|
|
50
|
+
unless unity_helper.unity_project?(@unity_root_path)
|
|
51
|
+
raise Informative, "当前目录不是 Unity 工程:#{@unity_root_path}"
|
|
59
52
|
end
|
|
60
53
|
|
|
61
54
|
true
|
|
@@ -64,27 +57,26 @@ module Pindo
|
|
|
64
57
|
protected
|
|
65
58
|
|
|
66
59
|
def do_work
|
|
67
|
-
# 确保 Unity helper 已初始化
|
|
68
|
-
@unity_helper ||= Pindo::Client::UnityHelper.share_instance
|
|
69
|
-
|
|
70
60
|
# 获取 Unity 版本
|
|
71
|
-
project_unity_version =
|
|
61
|
+
project_unity_version = get_unity_version
|
|
72
62
|
|
|
73
63
|
# 查找 Unity 执行路径
|
|
74
64
|
unless @unity_exe_path
|
|
75
|
-
@unity_exe_path =
|
|
65
|
+
@unity_exe_path = unity_helper.find_unity_path(
|
|
76
66
|
project_unity_version: project_unity_version,
|
|
77
67
|
force_change_version: false
|
|
78
68
|
)
|
|
79
69
|
end
|
|
80
70
|
|
|
81
71
|
if @unity_exe_path.nil? || @unity_exe_path.empty?
|
|
82
|
-
raise "无法找到 Unity 执行路径"
|
|
72
|
+
raise Informative, "无法找到 Unity 执行路径"
|
|
83
73
|
end
|
|
84
74
|
|
|
85
75
|
# 显示 Unity 信息
|
|
86
|
-
|
|
87
|
-
|
|
76
|
+
puts "项目路径: #{@unity_root_path}"
|
|
77
|
+
puts "Unity 执行路径: #{@unity_exe_path}"
|
|
78
|
+
puts "Unity 版本: #{project_unity_version}"
|
|
79
|
+
puts "部署模式: #{@deploy_mode}\n"
|
|
88
80
|
|
|
89
81
|
# 执行 Unity 导出
|
|
90
82
|
case @platform
|
|
@@ -95,20 +87,34 @@ module Pindo
|
|
|
95
87
|
when 'web', 'html'
|
|
96
88
|
export_web
|
|
97
89
|
else
|
|
98
|
-
raise "
|
|
90
|
+
raise Informative, "不支持的平台: #{@platform}"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# 重写清理方法,提供更精确的参数
|
|
95
|
+
def cleanup_unity_processes
|
|
96
|
+
Funlog.warning("清理 Unity 进程...")
|
|
97
|
+
begin
|
|
98
|
+
Pindo::Unity::UnityProcHelper.cleanup_unity_processes_after_build(
|
|
99
|
+
unity_exe_full_path: @unity_exe_path,
|
|
100
|
+
project_path: @unity_root_path
|
|
101
|
+
)
|
|
102
|
+
rescue => e
|
|
103
|
+
Funlog.warning("清理 Unity 进程失败: #{e.message}")
|
|
99
104
|
end
|
|
100
105
|
end
|
|
101
106
|
|
|
102
107
|
private
|
|
103
108
|
|
|
109
|
+
# 导出 iOS
|
|
104
110
|
def export_ios
|
|
105
111
|
platform = 'iOS'
|
|
106
112
|
|
|
107
113
|
# 设置导出路径(如果未指定)
|
|
108
114
|
if @export_path.nil?
|
|
109
115
|
# 优先使用 BaseiOS,如果不存在则使用 iOS
|
|
110
|
-
base_ios_path = File.join(@
|
|
111
|
-
ios_path = File.join(@
|
|
116
|
+
base_ios_path = File.join(@unity_root_path, "GoodPlatform", "BaseiOS")
|
|
117
|
+
ios_path = File.join(@unity_root_path, "GoodPlatform", "iOS")
|
|
112
118
|
|
|
113
119
|
@export_path = if File.exist?(base_ios_path)
|
|
114
120
|
base_ios_path
|
|
@@ -120,6 +126,10 @@ module Pindo
|
|
|
120
126
|
# 根据导出路径判断是否为库模式
|
|
121
127
|
@is_library_mode = @export_path.include?("BaseiOS")
|
|
122
128
|
|
|
129
|
+
puts "导出路径: #{@export_path}"
|
|
130
|
+
puts "导出平台: iOS"
|
|
131
|
+
puts "库模式: #{@is_library_mode ? '是' : '否'}\n"
|
|
132
|
+
|
|
123
133
|
result = execute_unity_build(platform)
|
|
124
134
|
|
|
125
135
|
{
|
|
@@ -130,14 +140,15 @@ module Pindo
|
|
|
130
140
|
}
|
|
131
141
|
end
|
|
132
142
|
|
|
143
|
+
# 导出 Android
|
|
133
144
|
def export_android
|
|
134
145
|
platform = 'Android'
|
|
135
146
|
|
|
136
147
|
# 设置导出路径(如果未指定)
|
|
137
148
|
if @export_path.nil?
|
|
138
149
|
# 优先使用 BaseAndroid,如果不存在则使用 Android
|
|
139
|
-
base_android_path = File.join(@
|
|
140
|
-
android_path = File.join(@
|
|
150
|
+
base_android_path = File.join(@unity_root_path, "GoodPlatform", "BaseAndroid")
|
|
151
|
+
android_path = File.join(@unity_root_path, "GoodPlatform", "Android")
|
|
141
152
|
|
|
142
153
|
@export_path = if File.exist?(base_android_path)
|
|
143
154
|
base_android_path
|
|
@@ -149,6 +160,10 @@ module Pindo
|
|
|
149
160
|
# 根据导出路径判断是否为库模式
|
|
150
161
|
@is_library_mode = @export_path.include?("BaseAndroid")
|
|
151
162
|
|
|
163
|
+
puts "导出路径: #{@export_path}"
|
|
164
|
+
puts "导出平台: Android"
|
|
165
|
+
puts "库模式: #{@is_library_mode ? '是' : '否'}\n"
|
|
166
|
+
|
|
152
167
|
result = execute_unity_build(platform)
|
|
153
168
|
|
|
154
169
|
{
|
|
@@ -159,13 +174,18 @@ module Pindo
|
|
|
159
174
|
}
|
|
160
175
|
end
|
|
161
176
|
|
|
177
|
+
# 导出 WebGL
|
|
162
178
|
def export_web
|
|
163
179
|
platform = 'WebGL'
|
|
164
|
-
result = execute_unity_build(platform)
|
|
165
180
|
|
|
166
181
|
# 设置导出路径(如果未指定)
|
|
167
182
|
# Web 平台只有一个目录
|
|
168
|
-
@export_path ||= File.join(@
|
|
183
|
+
@export_path ||= File.join(@unity_root_path, "GoodPlatform", "WebGL")
|
|
184
|
+
|
|
185
|
+
puts "导出路径: #{@export_path}"
|
|
186
|
+
puts "导出平台: WebGL\n"
|
|
187
|
+
|
|
188
|
+
result = execute_unity_build(platform)
|
|
169
189
|
|
|
170
190
|
{
|
|
171
191
|
success: true,
|
|
@@ -175,41 +195,19 @@ module Pindo
|
|
|
175
195
|
}
|
|
176
196
|
end
|
|
177
197
|
|
|
198
|
+
# 执行 Unity 导出
|
|
199
|
+
# Unity 进程管理(检查和清理)已封装在 UnityHelper.export_project 中
|
|
178
200
|
def execute_unity_build(platform)
|
|
179
|
-
#
|
|
180
|
-
|
|
201
|
+
# 执行导出
|
|
202
|
+
unity_helper.export_project(
|
|
181
203
|
unity_exe_full_path: @unity_exe_path,
|
|
182
|
-
project_path: @
|
|
204
|
+
project_path: @unity_root_path,
|
|
205
|
+
platform: platform,
|
|
206
|
+
isLibrary: @is_library_mode,
|
|
207
|
+
indexNo: @index_count,
|
|
208
|
+
deployMode: @deploy_mode
|
|
183
209
|
)
|
|
184
|
-
|
|
185
|
-
# 执行构建
|
|
186
|
-
begin
|
|
187
|
-
result = @unity_helper.build_project(
|
|
188
|
-
unity_exe_full_path: @unity_exe_path,
|
|
189
|
-
project_path: @unity_project_path,
|
|
190
|
-
platform: platform,
|
|
191
|
-
isLibrary: @is_library_mode,
|
|
192
|
-
indexNo: @index_count,
|
|
193
|
-
deployMode: @deploy_mode
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
# 清理 Unity 进程
|
|
197
|
-
@unity_helper.cleanup_unity_processes_after_build(
|
|
198
|
-
unity_exe_full_path: @unity_exe_path,
|
|
199
|
-
project_path: @unity_project_path
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
result
|
|
203
|
-
rescue => e
|
|
204
|
-
# 确保清理进程
|
|
205
|
-
@unity_helper.cleanup_unity_processes_after_build(
|
|
206
|
-
unity_exe_full_path: @unity_exe_path,
|
|
207
|
-
project_path: @unity_project_path
|
|
208
|
-
) rescue nil
|
|
209
|
-
|
|
210
|
-
raise e
|
|
211
|
-
end
|
|
212
210
|
end
|
|
213
211
|
end
|
|
214
212
|
end
|
|
215
|
-
end
|
|
213
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require 'pindo/module/task/model/unity_task'
|
|
2
|
+
require 'pindo/base/funlog'
|
|
3
|
+
|
|
4
|
+
module Pindo
|
|
5
|
+
module TaskSystem
|
|
6
|
+
# Unity 更新必备库任务
|
|
7
|
+
# 用于强制更新 Unity 项目的必备库(NugetForUnity)
|
|
8
|
+
class UnityUpdateTask < UnityTask
|
|
9
|
+
# 任务键
|
|
10
|
+
def self.task_key
|
|
11
|
+
:unity_update
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# @param options [Hash] 额外选项
|
|
15
|
+
# - :project_path [String] Unity 项目路径(默认当前目录)
|
|
16
|
+
def initialize(options = {})
|
|
17
|
+
@unity_exe_path = nil # 将在 do_work 中自动查找
|
|
18
|
+
|
|
19
|
+
# 传递 project_path 给基类
|
|
20
|
+
options[:project_path] ||= Dir.pwd
|
|
21
|
+
super("Unity工具库更新", options)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def validate
|
|
25
|
+
super
|
|
26
|
+
|
|
27
|
+
# 验证 Unity 工程是否存在
|
|
28
|
+
unless unity_helper.unity_project?(@unity_root_path)
|
|
29
|
+
raise Informative, "当前目录不是 Unity 工程:#{@unity_root_path}"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
protected
|
|
36
|
+
|
|
37
|
+
def do_work
|
|
38
|
+
# 获取 Unity 版本
|
|
39
|
+
project_unity_version = get_unity_version
|
|
40
|
+
|
|
41
|
+
# 查找 Unity 执行路径
|
|
42
|
+
unless @unity_exe_path
|
|
43
|
+
@unity_exe_path = unity_helper.find_unity_path(
|
|
44
|
+
project_unity_version: project_unity_version,
|
|
45
|
+
force_change_version: false
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
if @unity_exe_path.nil? || @unity_exe_path.empty?
|
|
50
|
+
raise Informative, "无法找到 Unity 执行路径"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# 显示 Unity 信息
|
|
54
|
+
puts "项目路径: #{@unity_root_path}"
|
|
55
|
+
puts "Unity 执行路径: #{@unity_exe_path}"
|
|
56
|
+
puts "Unity 版本: #{project_unity_version}\n"
|
|
57
|
+
|
|
58
|
+
# 执行必备库更新
|
|
59
|
+
result = force_update_libraries
|
|
60
|
+
|
|
61
|
+
result
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# 重写清理方法,提供更精确的参数
|
|
65
|
+
def cleanup_unity_processes
|
|
66
|
+
Funlog.warning("清理 Unity 进程...")
|
|
67
|
+
begin
|
|
68
|
+
Pindo::Unity::UnityProcHelper.cleanup_unity_processes_after_build(
|
|
69
|
+
unity_exe_full_path: @unity_exe_path,
|
|
70
|
+
project_path: @unity_root_path
|
|
71
|
+
)
|
|
72
|
+
rescue => e
|
|
73
|
+
Funlog.warning("清理 Unity 进程失败: #{e.message}")
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# 强制更新必备库
|
|
80
|
+
def force_update_libraries
|
|
81
|
+
# 调用 UnityHelper 的 force_update_libraries 方法
|
|
82
|
+
result = unity_helper.force_update_libraries(
|
|
83
|
+
unity_exe_full_path: @unity_exe_path,
|
|
84
|
+
project_path: @unity_root_path
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# 返回成功结果
|
|
88
|
+
{
|
|
89
|
+
success: true,
|
|
90
|
+
unity_result: result
|
|
91
|
+
}
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
require 'pindo/module/task/model/unity_task'
|
|
2
|
+
require 'pindo/base/funlog'
|
|
3
|
+
|
|
4
|
+
module Pindo
|
|
5
|
+
module TaskSystem
|
|
6
|
+
# Unity YooAsset 资源构建任务
|
|
7
|
+
# 用于构建 YooAsset 资源包
|
|
8
|
+
class UnityYooAssetTask < UnityTask
|
|
9
|
+
attr_reader :platform
|
|
10
|
+
|
|
11
|
+
# 任务键
|
|
12
|
+
def self.task_key
|
|
13
|
+
:unity_yoo_asset
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @param platform [String] 目标平台 ('ios', 'android', 'web')
|
|
17
|
+
# @param options [Hash] 额外选项
|
|
18
|
+
# - :project_path [String] Unity 项目路径(默认当前目录)
|
|
19
|
+
def initialize(platform, options = {})
|
|
20
|
+
@platform = platform
|
|
21
|
+
@unity_exe_path = nil # 将在 do_work 中自动查找
|
|
22
|
+
|
|
23
|
+
name = case platform
|
|
24
|
+
when 'ios', 'ipa'
|
|
25
|
+
"YooAsset打包iOS平台资源"
|
|
26
|
+
when 'android', 'apk'
|
|
27
|
+
"YooAsset打包Android平台资源"
|
|
28
|
+
when 'web', 'html'
|
|
29
|
+
"YooAsset打包WebGL平台资源"
|
|
30
|
+
else
|
|
31
|
+
"YooAsset打包#{platform.upcase}资源"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# 传递 project_path 给基类
|
|
35
|
+
options[:project_path] ||= Dir.pwd
|
|
36
|
+
super(name, options)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def validate
|
|
40
|
+
super
|
|
41
|
+
|
|
42
|
+
# 验证 Unity 工程是否存在
|
|
43
|
+
unless unity_helper.unity_project?(@unity_root_path)
|
|
44
|
+
raise Informative, "当前目录不是 Unity 工程:#{@unity_root_path}"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
protected
|
|
51
|
+
|
|
52
|
+
def do_work
|
|
53
|
+
# 获取 Unity 版本
|
|
54
|
+
project_unity_version = get_unity_version
|
|
55
|
+
|
|
56
|
+
# 查找 Unity 执行路径
|
|
57
|
+
unless @unity_exe_path
|
|
58
|
+
@unity_exe_path = unity_helper.find_unity_path(
|
|
59
|
+
project_unity_version: project_unity_version,
|
|
60
|
+
force_change_version: false
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if @unity_exe_path.nil? || @unity_exe_path.empty?
|
|
65
|
+
raise Informative, "无法找到 Unity 执行路径"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# 显示 Unity 信息
|
|
69
|
+
puts "项目路径: #{@unity_root_path}"
|
|
70
|
+
puts "Unity 执行路径: #{@unity_exe_path}"
|
|
71
|
+
puts "Unity 版本: #{project_unity_version}"
|
|
72
|
+
puts "目标平台: #{normalize_platform_name(@platform)}\n"
|
|
73
|
+
|
|
74
|
+
# 执行 YooAsset 构建
|
|
75
|
+
result = build_yoo_asset
|
|
76
|
+
|
|
77
|
+
result
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# 重写清理方法,提供更精确的参数
|
|
81
|
+
def cleanup_unity_processes
|
|
82
|
+
Funlog.warning("清理 Unity 进程...")
|
|
83
|
+
begin
|
|
84
|
+
Pindo::Unity::UnityProcHelper.cleanup_unity_processes_after_build(
|
|
85
|
+
unity_exe_full_path: @unity_exe_path,
|
|
86
|
+
project_path: @unity_root_path
|
|
87
|
+
)
|
|
88
|
+
rescue => e
|
|
89
|
+
Funlog.warning("清理 Unity 进程失败: #{e.message}")
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
# 构建 YooAsset 资源
|
|
96
|
+
def build_yoo_asset
|
|
97
|
+
platform_name = normalize_platform_name(@platform)
|
|
98
|
+
|
|
99
|
+
# 调用 UnityHelper 的 build_yoo_asset 方法
|
|
100
|
+
result = unity_helper.build_yoo_asset(
|
|
101
|
+
unity_exe_full_path: @unity_exe_path,
|
|
102
|
+
project_path: @unity_root_path,
|
|
103
|
+
platform: platform_name
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# 如果跳过(YooAsset 不存在),输出警告并显示命令
|
|
107
|
+
if result[:skipped]
|
|
108
|
+
Funlog.warning("项目中未检测到 YooAsset,跳过资源构建")
|
|
109
|
+
print_unity_command
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
skipped: true,
|
|
114
|
+
platform: @platform,
|
|
115
|
+
reason: result[:reason]
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# 正常完成
|
|
120
|
+
{
|
|
121
|
+
success: true,
|
|
122
|
+
platform: @platform,
|
|
123
|
+
unity_result: result
|
|
124
|
+
}
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# 打印将要执行的 Unity 命令
|
|
128
|
+
def print_unity_command
|
|
129
|
+
platform_name = normalize_platform_name(@platform)
|
|
130
|
+
|
|
131
|
+
cmd = "#{@unity_exe_path} -batchmode -quit " \
|
|
132
|
+
"-projectPath #{@unity_root_path} " \
|
|
133
|
+
"-executeMethod Yoo.Editor.YooCommandHelper.BatchBuild " \
|
|
134
|
+
"-platform #{platform_name}"
|
|
135
|
+
|
|
136
|
+
puts "\n本应执行的 Unity 命令:"
|
|
137
|
+
puts cmd
|
|
138
|
+
puts ""
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# 标准化平台名称
|
|
142
|
+
def normalize_platform_name(platform)
|
|
143
|
+
case platform
|
|
144
|
+
when 'ios', 'ipa'
|
|
145
|
+
'iOS'
|
|
146
|
+
when 'android', 'apk'
|
|
147
|
+
'Android'
|
|
148
|
+
when 'web', 'html'
|
|
149
|
+
'WebGL'
|
|
150
|
+
else
|
|
151
|
+
platform.to_s
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require 'pindo/module/task/pindo_task'
|
|
2
|
+
require 'pindo/module/unity/unity_helper'
|
|
3
|
+
require 'pindo/module/unity/unity_proc_helper'
|
|
4
|
+
|
|
5
|
+
module Pindo
|
|
6
|
+
module TaskSystem
|
|
7
|
+
# Unity 任务基类
|
|
8
|
+
# 所有 Unity 相关任务的父类,提供通用的 Unity 操作和配置
|
|
9
|
+
class UnityTask < PindoTask
|
|
10
|
+
attr_reader :project_path, :unity_root_path
|
|
11
|
+
|
|
12
|
+
def initialize(name, options = {})
|
|
13
|
+
@project_path = options[:project_path] ? File.expand_path(options[:project_path]) : nil
|
|
14
|
+
@unity_root_path = options[:unity_root_path] || @project_path
|
|
15
|
+
|
|
16
|
+
super(name, options)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Unity 任务类型
|
|
20
|
+
def self.task_type
|
|
21
|
+
:unity
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Unity 任务类型显示名称
|
|
25
|
+
def self.task_type_name
|
|
26
|
+
"Unity操作"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Unity 任务默认重试配置
|
|
30
|
+
def self.default_retry_mode
|
|
31
|
+
RetryMode::DELAYED
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.default_retry_count
|
|
35
|
+
2 # Unity 任务默认重试 2 次
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.default_retry_delay
|
|
39
|
+
15 # Unity 任务默认延迟 15 秒重试
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# 验证 Unity 项目路径
|
|
43
|
+
def validate
|
|
44
|
+
super
|
|
45
|
+
|
|
46
|
+
unless File.directory?(@project_path)
|
|
47
|
+
raise Informative, "Unity 项目路径不存在: #{@project_path}"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
unless File.directory?(@unity_root_path)
|
|
51
|
+
raise Informative, "Unity 根目录不存在: #{@unity_root_path}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# 获取 Unity Helper
|
|
58
|
+
def unity_helper
|
|
59
|
+
@unity_helper ||= Pindo::Unity::UnityHelper.share_instance
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# 重试前清理 Unity 进程
|
|
63
|
+
def before_retry
|
|
64
|
+
super
|
|
65
|
+
cleanup_unity_processes
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
protected
|
|
69
|
+
|
|
70
|
+
# 检查 Unity 项目是否有效
|
|
71
|
+
def valid_unity_project?
|
|
72
|
+
# 检查是否存在 Assets 和 ProjectSettings 目录
|
|
73
|
+
assets_path = File.join(@unity_root_path, 'Assets')
|
|
74
|
+
project_settings_path = File.join(@unity_root_path, 'ProjectSettings')
|
|
75
|
+
|
|
76
|
+
File.directory?(assets_path) && File.directory?(project_settings_path)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# 清理 Unity 进程
|
|
80
|
+
def cleanup_unity_processes
|
|
81
|
+
Funlog.warning("清理 Unity 进程...")
|
|
82
|
+
begin
|
|
83
|
+
# 调用 UnityProcHelper 的清理方法
|
|
84
|
+
# 如果子类有 unity_exe_path,可以重写这个方法传入更精确的参数
|
|
85
|
+
Pindo::Unity::UnityProcHelper.cleanup_unity_processes_after_build(
|
|
86
|
+
unity_exe_full_path: nil,
|
|
87
|
+
project_path: @unity_root_path
|
|
88
|
+
)
|
|
89
|
+
rescue => e
|
|
90
|
+
Funlog.warning("清理 Unity 进程失败: #{e.message}")
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# 获取 Unity 版本
|
|
95
|
+
def get_unity_version
|
|
96
|
+
version_file = File.join(@unity_root_path, 'ProjectSettings', 'ProjectVersion.txt')
|
|
97
|
+
return nil unless File.exist?(version_file)
|
|
98
|
+
|
|
99
|
+
content = File.read(version_file)
|
|
100
|
+
match = content.match(/m_EditorVersion:\s*(.+)/)
|
|
101
|
+
match ? match[1].strip : nil
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# 打印 Unity 项目信息
|
|
105
|
+
def print_unity_info
|
|
106
|
+
puts "\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
107
|
+
puts " Unity 项目信息"
|
|
108
|
+
puts "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
109
|
+
puts "项目路径: #{@project_path}"
|
|
110
|
+
puts "Unity 根路径: #{@unity_root_path}"
|
|
111
|
+
|
|
112
|
+
version = get_unity_version
|
|
113
|
+
puts "Unity 版本: #{version || '未知'}"
|
|
114
|
+
puts "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|