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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +247 -42
  3. data/lib/pindo/command/android/autobuild.rb +104 -31
  4. data/lib/pindo/command/android/autoresign.rb +23 -322
  5. data/lib/pindo/command/android/keystore.rb +7 -130
  6. data/lib/pindo/command/appstore/adhocbuild.rb +52 -15
  7. data/lib/pindo/command/appstore/autobuild.rb +104 -8
  8. data/lib/pindo/command/appstore/autoresign.rb +3 -5
  9. data/lib/pindo/command/ios/autobuild.rb +96 -32
  10. data/lib/pindo/command/ios/build.rb +8 -186
  11. data/lib/pindo/command/jps/media.rb +146 -0
  12. data/lib/pindo/command/jps/upload.rb +49 -21
  13. data/lib/pindo/command/jps.rb +1 -0
  14. data/lib/pindo/command/unity/autobuild.rb +141 -32
  15. data/lib/pindo/command/unity/packpush.rb +5 -8
  16. data/lib/pindo/command/utils/repoinit.rb +0 -2
  17. data/lib/pindo/command/utils/tag.rb +58 -26
  18. data/lib/pindo/command/utils.rb +0 -1
  19. data/lib/pindo/command/web/autobuild.rb +98 -34
  20. data/lib/pindo/command.rb +0 -56
  21. data/lib/pindo/config/build_info_manager.rb +7 -8
  22. data/lib/pindo/module/android/android_config_helper.rb +2 -11
  23. data/lib/pindo/module/appselect.rb +15 -41
  24. data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
  25. data/lib/pindo/module/build/build_helper.rb +28 -18
  26. data/lib/pindo/module/build/git_repo_helper.rb +284 -405
  27. data/lib/pindo/module/cert/pem_helper.rb +3 -6
  28. data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
  29. data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
  30. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
  31. data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
  32. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
  33. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
  34. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
  35. data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
  36. data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
  37. data/lib/pindo/module/task/model/build_task.rb +8 -11
  38. data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
  39. data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
  40. data/lib/pindo/module/task/model/git_task.rb +75 -0
  41. data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
  42. data/lib/pindo/module/task/model/{jps_resign_task.rb → jps/jps_resign_task.rb} +14 -23
  43. data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
  44. data/lib/pindo/module/task/model/{jps_upload_task.rb → jps/jps_upload_task.rb} +39 -94
  45. data/lib/pindo/module/task/model/jps_task.rb +43 -0
  46. data/lib/pindo/module/task/model/{ipa_local_resign_task.rb → resign/ipa_local_resign_task.rb} +7 -2
  47. data/lib/pindo/module/task/model/unity/unity_config_task.rb +103 -0
  48. data/lib/pindo/module/task/model/{unity_export_task.rb → unity/unity_export_task.rb} +76 -78
  49. data/lib/pindo/module/task/model/unity/unity_update_task.rb +95 -0
  50. data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +156 -0
  51. data/lib/pindo/module/task/model/unity_task.rb +118 -0
  52. data/lib/pindo/module/task/pindo_task.rb +101 -1
  53. data/lib/pindo/module/task/task_manager.rb +29 -24
  54. data/lib/pindo/module/unity/nuget_helper.rb +7 -7
  55. data/lib/pindo/module/unity/unity_command_helper.rb +188 -0
  56. data/lib/pindo/module/unity/unity_env_helper.rb +208 -0
  57. data/lib/pindo/module/unity/unity_helper.rb +189 -746
  58. data/lib/pindo/module/unity/unity_proc_helper.rb +390 -0
  59. data/lib/pindo/options/core/global_options_state.rb +96 -26
  60. data/lib/pindo/options/core/option_configuration.rb +3 -0
  61. data/lib/pindo/options/core/option_item.rb +36 -0
  62. data/lib/pindo/options/groups/build_options.rb +23 -6
  63. data/lib/pindo/options/groups/git_options.rb +115 -0
  64. data/lib/pindo/options/groups/jps_options.rb +7 -0
  65. data/lib/pindo/options/groups/option_group.rb +15 -0
  66. data/lib/pindo/options/groups/unity_options.rb +49 -0
  67. data/lib/pindo/options/options.rb +2 -0
  68. data/lib/pindo/version.rb +2 -2
  69. metadata +25 -14
  70. data/lib/pindo/base/githelper.rb +0 -686
  71. data/lib/pindo/base/pindocontext.rb +0 -602
  72. data/lib/pindo/command/utils/feishu.rb +0 -134
  73. data/lib/pindo/module/build/version_helper.rb +0 -146
  74. data/lib/pindo/module/task/model/git_tag_task.rb +0 -80
@@ -1,61 +1,54 @@
1
- require_relative '../pindo_task'
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
- class UnityExportTask < PindoTask
7
- attr_reader :platform, :unity_project_path, :export_path
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
- def self.task_type
11
+ # 任务键
12
+ def self.task_key
10
13
  :unity_export
11
14
  end
12
15
 
13
- # 重试配置
14
- def self.default_retry_mode
15
- RetryMode::DELAYED
16
- end
17
-
18
- def self.default_retry_count
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
- @unity_helper = nil # 将在 do_work 中自动初始化
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 导出 iOS"
32
+ "Unity导出iOS平台"
39
33
  when 'android', 'apk'
40
- "Unity 导出 Android"
34
+ "Unity导出Android平台"
41
35
  when 'web', 'html'
42
- "Unity 导出 WebGL"
36
+ "Unity导出WebGL平台"
43
37
  else
44
- "Unity 导出 #{platform.upcase}"
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
- # 验证 Unity 工程是否存在
52
- unless @unity_helper
53
- @unity_helper = Pindo::Client::UnityHelper.share_instance
54
- end
47
+ super
55
48
 
56
- unless @unity_helper.unity_project?(@unity_project_path)
57
- @error = "当前目录不是 Unity 工程:#{@unity_project_path}"
58
- return false
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 = @unity_helper.get_unity_version(@unity_project_path)
61
+ project_unity_version = get_unity_version
72
62
 
73
63
  # 查找 Unity 执行路径
74
64
  unless @unity_exe_path
75
- @unity_exe_path = @unity_helper.find_unity_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
- Funlog.info("Unity 版本: #{project_unity_version}")
87
- Funlog.info("Unity 路径: #{@unity_exe_path}")
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 "Unsupported platform: #{@platform}"
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(@unity_project_path, "GoodPlatform", "BaseiOS")
111
- ios_path = File.join(@unity_project_path, "GoodPlatform", "iOS")
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(@unity_project_path, "GoodPlatform", "BaseAndroid")
140
- android_path = File.join(@unity_project_path, "GoodPlatform", "Android")
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(@unity_project_path, "GoodPlatform", "WebGL")
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
- # 检查 Unity 进程
180
- @unity_helper.check_unity_processes(
201
+ # 执行导出
202
+ unity_helper.export_project(
181
203
  unity_exe_full_path: @unity_exe_path,
182
- project_path: @unity_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