pindo 5.13.1 → 5.13.2

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 (110) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +692 -0
  3. data/lib/pindo/command/android/autobuild.rb +2 -2
  4. data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
  5. data/lib/pindo/command/appstore/autobuild.rb +203 -0
  6. data/lib/pindo/command/appstore/autoresign.rb +35 -17
  7. data/lib/pindo/command/appstore/bundleid.rb +120 -0
  8. data/lib/pindo/command/appstore/cert.rb +212 -0
  9. data/lib/pindo/command/appstore/configproj.rb +81 -0
  10. data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
  11. data/lib/pindo/command/appstore/iap.rb +788 -24
  12. data/lib/pindo/command/appstore/initconfig.rb +105 -0
  13. data/lib/pindo/command/appstore/itcapp.rb +95 -13
  14. data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
  15. data/lib/pindo/command/appstore/pem.rb +136 -0
  16. data/lib/pindo/command/appstore/pullconfig.rb +99 -0
  17. data/lib/pindo/command/appstore/quswark.rb +87 -0
  18. data/lib/pindo/command/appstore/quswauth.rb +67 -0
  19. data/lib/pindo/command/appstore/tag.rb +77 -0
  20. data/lib/pindo/command/appstore.rb +13 -1
  21. data/lib/pindo/command/env/quarkenv.rb +11 -13
  22. data/lib/pindo/command/env/swarkenv.rb +11 -16
  23. data/lib/pindo/command/ios/autobuild.rb +64 -43
  24. data/lib/pindo/command/ios/autoresign.rb +34 -19
  25. data/lib/pindo/command/ios/build.rb +9 -6
  26. data/lib/pindo/command/ios/cert.rb +27 -20
  27. data/lib/pindo/command/jps/upload.rb +3 -3
  28. data/lib/pindo/command/unity/autobuild.rb +2 -2
  29. data/lib/pindo/command/utils/clearcert.rb +2 -17
  30. data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
  31. data/lib/pindo/command/utils/renewcert.rb +62 -38
  32. data/lib/pindo/command/utils/renewproj.rb +0 -3
  33. data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
  34. data/lib/pindo/command/utils.rb +2 -0
  35. data/lib/pindo/command/web/autobuild.rb +2 -2
  36. data/lib/pindo/command.rb +30 -3
  37. data/lib/pindo/config/build_info_manager.rb +176 -0
  38. data/lib/pindo/config/ios_config_parser.rb +404 -0
  39. data/lib/pindo/module/android/android_config_helper.rb +9 -5
  40. data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
  41. data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
  42. data/lib/pindo/module/build/build_helper.rb +12 -0
  43. data/lib/pindo/module/build/swark_helper.rb +116 -77
  44. data/lib/pindo/module/cert/cert_helper.rb +74 -0
  45. data/lib/pindo/module/cert/pem_helper.rb +72 -0
  46. data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
  47. data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
  48. data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
  49. data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
  50. data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
  51. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
  52. data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
  53. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
  54. data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
  55. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
  56. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
  57. data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
  58. data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
  59. data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
  60. data/lib/pindo/module/task/model/build_task.rb +15 -12
  61. data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
  62. data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
  63. data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
  64. data/lib/pindo/module/unity/unity_helper.rb +2 -1
  65. data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
  66. data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
  67. data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
  68. data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
  69. data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
  70. data/lib/pindo/options/core/global_options_state.rb +268 -0
  71. data/lib/pindo/options/core/option_configuration.rb +206 -0
  72. data/lib/pindo/options/core/option_initializer.rb +51 -0
  73. data/lib/pindo/options/core/option_item.rb +144 -0
  74. data/lib/pindo/options/core/option_value_parser.rb +54 -0
  75. data/lib/pindo/options/groups/build_options.rb +60 -0
  76. data/lib/pindo/options/groups/jps_options.rb +70 -0
  77. data/lib/pindo/options/groups/option_group.rb +73 -0
  78. data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
  79. data/lib/pindo/options/options.rb +14 -0
  80. data/lib/pindo/version.rb +1 -1
  81. metadata +49 -40
  82. data/lib/pindo/command/appstore/import.rb +0 -259
  83. data/lib/pindo/command/deploy/build.rb +0 -250
  84. data/lib/pindo/command/deploy/bundleid.rb +0 -259
  85. data/lib/pindo/command/deploy/cert.rb +0 -202
  86. data/lib/pindo/command/deploy/check.rb +0 -93
  87. data/lib/pindo/command/deploy/configproj.rb +0 -120
  88. data/lib/pindo/command/deploy/confusecode.rb +0 -262
  89. data/lib/pindo/command/deploy/confuseproj.rb +0 -122
  90. data/lib/pindo/command/deploy/iap.rb +0 -826
  91. data/lib/pindo/command/deploy/initconfig.rb +0 -138
  92. data/lib/pindo/command/deploy/itcapp.rb +0 -146
  93. data/lib/pindo/command/deploy/pem.rb +0 -55
  94. data/lib/pindo/command/deploy/pullconfig.rb +0 -56
  95. data/lib/pindo/command/deploy/pushconfig.rb +0 -93
  96. data/lib/pindo/command/deploy/quswark.rb +0 -156
  97. data/lib/pindo/command/deploy/quswauth.rb +0 -76
  98. data/lib/pindo/command/deploy/reportbug.rb +0 -145
  99. data/lib/pindo/command/deploy/resign.rb +0 -300
  100. data/lib/pindo/command/deploy/tag.rb +0 -108
  101. data/lib/pindo/command/deploy/uploadipa.rb +0 -73
  102. data/lib/pindo/command/deploy.rb +0 -42
  103. data/lib/pindo/command/dev/autobuild.rb +0 -117
  104. data/lib/pindo/command/dev/build.rb +0 -94
  105. data/lib/pindo/command/dev/debug.rb +0 -112
  106. data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
  107. data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
  108. data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
  109. data/lib/pindo/options/appconfigoptions.rb +0 -24
  110. data/lib/pindo/options/deployoptions.rb +0 -372
@@ -0,0 +1,210 @@
1
+ require_relative 'android_build_task'
2
+ require 'pindo/module/build/build_helper'
3
+ require 'pindo/module/build/version_helper'
4
+ require 'pindo/module/build/git_repo_helper'
5
+ require 'pindo/module/android/android_config_helper'
6
+ require 'pindo/module/android/android_build_helper'
7
+ require 'pindo/module/pgyer/pgyerhelper'
8
+ require 'pindo/base/githelper'
9
+
10
+ module Pindo
11
+ module TaskSystem
12
+ # Android AdHoc 模式构建任务
13
+ # 使用 Release 模式编译 Android 工程(AdHoc 版本)
14
+ class AndroidBuildAdhocTask < AndroidBuildTask
15
+ include Pindo::Githelper
16
+
17
+ def initialize(options = {})
18
+ @bundle_name = options[:bundle_name]
19
+ @proj_name = options[:proj_name]
20
+ @upload_flag = options[:upload] || false
21
+ @send_flag = options[:send] || false
22
+
23
+ # 接收外部传入的 JPS 配置
24
+ @app_info_obj = options[:app_info_obj]
25
+ @workflow_info = options[:workflow_info]
26
+
27
+ super(:android, :adhoc, options)
28
+ end
29
+
30
+ protected
31
+
32
+ def build_task_name
33
+ "构建 APK (AdHoc)"
34
+ end
35
+
36
+ def prepare_build
37
+ # 校验必需的参数
38
+ Dir.chdir(@project_path)
39
+ validate_workflow_info
40
+ check_git_tag if @upload_flag
41
+ update_project_config
42
+ update_version_info
43
+ handle_bundle_name_config if @bundle_name
44
+ add_application_id_scheme
45
+ end
46
+
47
+ def execute_build
48
+ build_android_project
49
+ end
50
+
51
+ def find_output
52
+ # 搜索 APK 和 AAB 文件
53
+ search_paths = []
54
+ search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:apk].map { |p| File.join(@project_path, p) })
55
+ search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:aab].map { |p| File.join(@project_path, p) })
56
+
57
+ package_files = []
58
+ search_paths.each do |pattern|
59
+ package_files.concat(Dir.glob(pattern))
60
+ end
61
+
62
+ # 过滤测试包和未签名包
63
+ package_files.reject! do |f|
64
+ basename = File.basename(f).downcase
65
+ TaskConfig::EXCLUDED_PATTERNS.any? { |pattern| basename.include?(pattern) }
66
+ end
67
+
68
+ if package_files.any?
69
+ # 优先返回 AAB,其次 APK
70
+ aab_files = package_files.select { |f| f.end_with?(".aab") }
71
+ apk_files = package_files.select { |f| f.end_with?(".apk") }
72
+
73
+ latest_package = if aab_files.any?
74
+ aab_files.max_by { |f| File.mtime(f) }
75
+ elsif apk_files.any?
76
+ apk_files.max_by { |f| File.mtime(f) }
77
+ else
78
+ package_files.max_by { |f| File.mtime(f) }
79
+ end
80
+
81
+ puts " 找到 Android 包文件: #{latest_package}"
82
+ latest_package
83
+ else
84
+ puts " 警告: 未找到 APK/AAB 文件"
85
+ nil
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ # 校验工作流信息
92
+ def validate_workflow_info
93
+ unless @workflow_info && @workflow_info[:package_name]
94
+ raise Informative, "未提供工作流信息,请在创建任务时传入 workflow_info 参数"
95
+ end
96
+ end
97
+
98
+ # Git 标签检查
99
+ def check_git_tag
100
+ git_repo_helper = Pindo::GitRepoHelper.share_instance
101
+ is_need_add_tag, tag_action_params = git_repo_helper.check_is_need_add_tag?(@project_path)
102
+ if is_need_add_tag
103
+ git_repo_helper.create_and_push_tag(
104
+ project_dir: @project_path,
105
+ mode: 'minor',
106
+ force_retag: tag_action_params&.include?('--retag') || false,
107
+ custom_tag: nil,
108
+ release_branch: 'master'
109
+ )
110
+ end
111
+ end
112
+
113
+ # 更新工程配置
114
+ def update_project_config
115
+ workflow_packname = @workflow_info[:package_name]
116
+
117
+ puts "\n使用工作流配置更新 Android 项目:"
118
+ puts " Workflow Package Name: #{workflow_packname}"
119
+
120
+ # 更新 App Name、Application ID 和 URL Schemes
121
+ Pindo::AndroidConfigHelper.update_project_with_workflow(
122
+ project_dir: @project_path,
123
+ workflow_packname: workflow_packname
124
+ )
125
+
126
+ # 下载并替换 Icon
127
+ if @app_info_obj && @app_info_obj["projectIcon"] && !@app_info_obj["projectIcon"].empty?
128
+ icon_replace_success = Pindo::AndroidConfigHelper.download_and_replace_icon_from_url(
129
+ project_dir: @project_path,
130
+ icon_url: @app_info_obj["projectIcon"]
131
+ )
132
+
133
+ unless icon_replace_success
134
+ raise Informative, "Icon 下载或替换失败,请检查 Icon URL 是否有效: #{@app_info_obj["projectIcon"]}"
135
+ end
136
+ else
137
+ Funlog.warning("未配置 Icon URL,跳过 Icon 替换")
138
+ end
139
+ end
140
+
141
+ # 更新版本号
142
+ def update_version_info
143
+ version_helper = Pindo::VersionHelper.share_instance
144
+ version_info = version_helper.get_version_info(project_dir: @project_path)
145
+
146
+ if version_info[:is_git_repo]
147
+ Pindo::AndroidConfigHelper.update_android_project_version(
148
+ project_dir: @project_path,
149
+ version_name: version_info[:version],
150
+ version_code: version_info[:build_number]
151
+ )
152
+ else
153
+ Funlog.warning("非Git仓库,保持工程原有版本号")
154
+ end
155
+ end
156
+
157
+ # 处理 Bundle Name 特殊配置
158
+ def handle_bundle_name_config
159
+ return unless @bundle_name && !@bundle_name.empty?
160
+
161
+ puts "\n正在处理指定的 Bundle Name: #{@bundle_name}..."
162
+
163
+ # 检查是否为通配符
164
+ is_wildcard = @bundle_name.include?('*') ||
165
+ @bundle_name.end_with?('.') ||
166
+ ['com.test', 'com.example', 'com.demo'].include?(@bundle_name)
167
+
168
+ if is_wildcard
169
+ puts " ⚠️ 检测到通配符或通用 Bundle Name: #{@bundle_name}"
170
+ puts " ⚠️ 跳过 google-services.json 和 Application ID 更新"
171
+ else
172
+ # 拉取配置仓库
173
+ config_repo_dir = clong_buildconfig_repo(repo_name: @bundle_name)
174
+
175
+ if config_repo_dir && File.exist?(config_repo_dir)
176
+ # 拷贝 google-services.json
177
+ Pindo::AndroidConfigHelper.copy_google_services_from_config_repo(
178
+ config_repo_dir: config_repo_dir,
179
+ project_dir: @project_path
180
+ )
181
+
182
+ # 更新 Application ID
183
+ Pindo::AndroidConfigHelper.update_application_id(
184
+ project_dir: @project_path,
185
+ application_id: @bundle_name
186
+ )
187
+
188
+ puts " ✓ Bundle Name 配置处理完成"
189
+ else
190
+ raise Informative, "无法获取配置仓库"
191
+ end
192
+ end
193
+ end
194
+
195
+ # 添加基于 Application ID 的 Scheme
196
+ def add_application_id_scheme
197
+ Pindo::AndroidConfigHelper.add_application_id_based_scheme(
198
+ project_dir: @project_path
199
+ )
200
+ end
201
+
202
+ # 构建 Android 工程
203
+ def build_android_project
204
+ android_build_helper = Pindo::AndroidBuildHelper.share_instance
205
+ # 第二个参数 false 表示 release 模式
206
+ android_build_helper.auto_build_apk(@project_path, false)
207
+ end
208
+ end
209
+ end
210
+ end
@@ -1,4 +1,4 @@
1
- require_relative '../build_task'
1
+ require_relative 'android_build_task'
2
2
  require 'pindo/module/build/build_helper'
3
3
  require 'pindo/module/build/version_helper'
4
4
  require 'pindo/module/build/git_repo_helper'
@@ -11,7 +11,7 @@ module Pindo
11
11
  module TaskSystem
12
12
  # Android Dev 模式构建任务
13
13
  # 使用 Debug 模式编译 Android 工程
14
- class AndroidDevBuildTask < BuildTask
14
+ class AndroidBuildDevTask < AndroidBuildTask
15
15
  include Pindo::Githelper
16
16
  def initialize(options = {})
17
17
  @bundle_name = options[:bundle_name]
@@ -0,0 +1,210 @@
1
+ require_relative 'android_build_task'
2
+ require 'pindo/module/build/build_helper'
3
+ require 'pindo/module/build/version_helper'
4
+ require 'pindo/module/build/git_repo_helper'
5
+ require 'pindo/module/android/android_config_helper'
6
+ require 'pindo/module/android/android_build_helper'
7
+ require 'pindo/module/pgyer/pgyerhelper'
8
+ require 'pindo/base/githelper'
9
+
10
+ module Pindo
11
+ module TaskSystem
12
+ # Android Google Play 模式构建任务
13
+ # 使用 Release 模式编译 Android 工程用于 Google Play 发布
14
+ class AndroidBuildGPlayTask < AndroidBuildTask
15
+ include Pindo::Githelper
16
+
17
+ def initialize(options = {})
18
+ @bundle_name = options[:bundle_name]
19
+ @proj_name = options[:proj_name]
20
+ @upload_flag = options[:upload] || false
21
+ @send_flag = options[:send] || false
22
+
23
+ # 接收外部传入的 JPS 配置
24
+ @app_info_obj = options[:app_info_obj]
25
+ @workflow_info = options[:workflow_info]
26
+
27
+ super(:android, :release, options)
28
+ end
29
+
30
+ protected
31
+
32
+ def build_task_name
33
+ "构建 APK (Release)"
34
+ end
35
+
36
+ def prepare_build
37
+ # 校验必需的参数
38
+ Dir.chdir(@project_path)
39
+ validate_workflow_info
40
+ check_git_tag if @upload_flag
41
+ update_project_config
42
+ update_version_info
43
+ handle_bundle_name_config if @bundle_name
44
+ add_application_id_scheme
45
+ end
46
+
47
+ def execute_build
48
+ build_android_project
49
+ end
50
+
51
+ def find_output
52
+ # 搜索 APK 和 AAB 文件
53
+ search_paths = []
54
+ search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:apk].map { |p| File.join(@project_path, p) })
55
+ search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:aab].map { |p| File.join(@project_path, p) })
56
+
57
+ package_files = []
58
+ search_paths.each do |pattern|
59
+ package_files.concat(Dir.glob(pattern))
60
+ end
61
+
62
+ # 过滤测试包和未签名包
63
+ package_files.reject! do |f|
64
+ basename = File.basename(f).downcase
65
+ TaskConfig::EXCLUDED_PATTERNS.any? { |pattern| basename.include?(pattern) }
66
+ end
67
+
68
+ if package_files.any?
69
+ # 优先返回 AAB,其次 APK
70
+ aab_files = package_files.select { |f| f.end_with?(".aab") }
71
+ apk_files = package_files.select { |f| f.end_with?(".apk") }
72
+
73
+ latest_package = if aab_files.any?
74
+ aab_files.max_by { |f| File.mtime(f) }
75
+ elsif apk_files.any?
76
+ apk_files.max_by { |f| File.mtime(f) }
77
+ else
78
+ package_files.max_by { |f| File.mtime(f) }
79
+ end
80
+
81
+ puts " 找到 Android 包文件: #{latest_package}"
82
+ latest_package
83
+ else
84
+ puts " 警告: 未找到 APK/AAB 文件"
85
+ nil
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ # 校验工作流信息
92
+ def validate_workflow_info
93
+ unless @workflow_info && @workflow_info[:package_name]
94
+ raise Informative, "未提供工作流信息,请在创建任务时传入 workflow_info 参数"
95
+ end
96
+ end
97
+
98
+ # Git 标签检查
99
+ def check_git_tag
100
+ git_repo_helper = Pindo::GitRepoHelper.share_instance
101
+ is_need_add_tag, tag_action_params = git_repo_helper.check_is_need_add_tag?(@project_path)
102
+ if is_need_add_tag
103
+ git_repo_helper.create_and_push_tag(
104
+ project_dir: @project_path,
105
+ mode: 'minor',
106
+ force_retag: tag_action_params&.include?('--retag') || false,
107
+ custom_tag: nil,
108
+ release_branch: 'master'
109
+ )
110
+ end
111
+ end
112
+
113
+ # 更新工程配置
114
+ def update_project_config
115
+ workflow_packname = @workflow_info[:package_name]
116
+
117
+ puts "\n使用工作流配置更新 Android 项目:"
118
+ puts " Workflow Package Name: #{workflow_packname}"
119
+
120
+ # 更新 App Name、Application ID 和 URL Schemes
121
+ Pindo::AndroidConfigHelper.update_project_with_workflow(
122
+ project_dir: @project_path,
123
+ workflow_packname: workflow_packname
124
+ )
125
+
126
+ # 下载并替换 Icon
127
+ if @app_info_obj && @app_info_obj["projectIcon"] && !@app_info_obj["projectIcon"].empty?
128
+ icon_replace_success = Pindo::AndroidConfigHelper.download_and_replace_icon_from_url(
129
+ project_dir: @project_path,
130
+ icon_url: @app_info_obj["projectIcon"]
131
+ )
132
+
133
+ unless icon_replace_success
134
+ raise Informative, "Icon 下载或替换失败,请检查 Icon URL 是否有效: #{@app_info_obj["projectIcon"]}"
135
+ end
136
+ else
137
+ Funlog.warning("未配置 Icon URL,跳过 Icon 替换")
138
+ end
139
+ end
140
+
141
+ # 更新版本号
142
+ def update_version_info
143
+ version_helper = Pindo::VersionHelper.share_instance
144
+ version_info = version_helper.get_version_info(project_dir: @project_path)
145
+
146
+ if version_info[:is_git_repo]
147
+ Pindo::AndroidConfigHelper.update_android_project_version(
148
+ project_dir: @project_path,
149
+ version_name: version_info[:version],
150
+ version_code: version_info[:build_number]
151
+ )
152
+ else
153
+ Funlog.warning("非Git仓库,保持工程原有版本号")
154
+ end
155
+ end
156
+
157
+ # 处理 Bundle Name 特殊配置
158
+ def handle_bundle_name_config
159
+ return unless @bundle_name && !@bundle_name.empty?
160
+
161
+ puts "\n正在处理指定的 Bundle Name: #{@bundle_name}..."
162
+
163
+ # 检查是否为通配符
164
+ is_wildcard = @bundle_name.include?('*') ||
165
+ @bundle_name.end_with?('.') ||
166
+ ['com.test', 'com.example', 'com.demo'].include?(@bundle_name)
167
+
168
+ if is_wildcard
169
+ puts " ⚠️ 检测到通配符或通用 Bundle Name: #{@bundle_name}"
170
+ puts " ⚠️ 跳过 google-services.json 和 Application ID 更新"
171
+ else
172
+ # 拉取配置仓库
173
+ config_repo_dir = clong_buildconfig_repo(repo_name: @bundle_name)
174
+
175
+ if config_repo_dir && File.exist?(config_repo_dir)
176
+ # 拷贝 google-services.json
177
+ Pindo::AndroidConfigHelper.copy_google_services_from_config_repo(
178
+ config_repo_dir: config_repo_dir,
179
+ project_dir: @project_path
180
+ )
181
+
182
+ # 更新 Application ID
183
+ Pindo::AndroidConfigHelper.update_application_id(
184
+ project_dir: @project_path,
185
+ application_id: @bundle_name
186
+ )
187
+
188
+ puts " ✓ Bundle Name 配置处理完成"
189
+ else
190
+ raise Informative, "无法获取配置仓库"
191
+ end
192
+ end
193
+ end
194
+
195
+ # 添加基于 Application ID 的 Scheme
196
+ def add_application_id_scheme
197
+ Pindo::AndroidConfigHelper.add_application_id_based_scheme(
198
+ project_dir: @project_path
199
+ )
200
+ end
201
+
202
+ # 构建 Android 工程
203
+ def build_android_project
204
+ android_build_helper = Pindo::AndroidBuildHelper.share_instance
205
+ # 第二个参数 false 表示 release 模式
206
+ android_build_helper.auto_build_apk(@project_path, false)
207
+ end
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../build_task'
2
+
3
+ module Pindo
4
+ module TaskSystem
5
+ # Android 构建任务基类
6
+ # 所有 Android 平台构建任务的抽象基类
7
+ # 子类包括:AndroidBuildDevTask、AndroidBuildAdhocTask、AndroidBuildGPlayTask
8
+ class AndroidBuildTask < BuildTask
9
+ # 空基类,仅用于类型标识
10
+ # 所有具体实现由子类完成
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,197 @@
1
+ require_relative 'ios_build_task'
2
+ require 'pindo/module/build/build_helper'
3
+ require 'pindo/module/build/version_helper'
4
+ require 'pindo/module/build/git_repo_helper'
5
+ require 'pindo/module/xcode/xcode_build_config'
6
+ require 'pindo/module/xcode/xcode_build_helper'
7
+ require 'pindo/module/pgyer/pgyerhelper'
8
+
9
+ module Pindo
10
+ module TaskSystem
11
+ # iOS AdHoc 模式构建任务
12
+ # 使用 AdHoc 证书编译 iOS 工程
13
+ class IosBuildAdhocTask < IosBuildTask
14
+ def initialize(options = {})
15
+ @bundle_id = options[:bundle_id]
16
+
17
+ @proj_name = options[:proj_name]
18
+
19
+ @upload_flag = options[:upload] || false
20
+ @send_flag = options[:send] || false
21
+ @macos_flag = false
22
+
23
+ # 接收外部传入的 JPS 配置
24
+ @app_info_obj = options[:app_info_obj]
25
+ @workflow_info = options[:workflow_info]
26
+
27
+ # 保存 Unity 根目录路径(用于查找 config.json)
28
+ @unity_root_path = options[:unity_root_path]
29
+
30
+ super(:ios, :adhoc, options)
31
+ end
32
+
33
+ protected
34
+
35
+ def build_task_name
36
+ "构建 IPA (AdHoc)"
37
+ end
38
+
39
+ def prepare_build
40
+
41
+ Dir.chdir(@project_path)
42
+ cleanup_firebase_shell
43
+ update_project_config
44
+ update_version_info
45
+ pull_config
46
+ handle_cocoapods
47
+ end
48
+
49
+ def execute_build
50
+ configure_certificate
51
+ update_url_schemes_final
52
+ build_ios_project
53
+ end
54
+
55
+ def find_output
56
+ build_path = File.join(@project_path, "build", "*.{ipa,app}")
57
+ ipa_files = Dir.glob(build_path)
58
+
59
+ if ipa_files.any?
60
+ latest_ipa = ipa_files.max_by { |f| File.mtime(f) }
61
+ puts " 找到 IPA 文件: #{latest_ipa}"
62
+ latest_ipa
63
+ else
64
+ puts " 警告: 未找到 IPA 文件"
65
+ nil
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+
72
+
73
+ # 清理 Firebase Shell Script
74
+ def cleanup_firebase_shell
75
+ project_fullname = Dir.glob(File.join(@project_path, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
76
+ if !project_fullname.nil? && File.exist?(project_fullname)
77
+ Pindo::XcodeBuildHelper.delete_libtarget_firebase_shell(@project_path)
78
+ end
79
+ end
80
+
81
+ # 更新工程配置
82
+ def update_project_config
83
+
84
+
85
+ end
86
+
87
+ # 更新版本号
88
+ def update_version_info
89
+
90
+ end
91
+
92
+ # 拉取配置
93
+ def pull_config
94
+ return unless @bundle_id
95
+
96
+ build_helper = Pindo::BuildHelper.share_instance
97
+ build_helper.pull_appconfig_with_reponame(
98
+ repo_name: @bundle_id,
99
+ target_dir: @project_path
100
+ )
101
+
102
+ # 重新加载配置到 IosConfigParser
103
+ config_file = File.join(@project_path, "config.json")
104
+ if File.exist?(config_file)
105
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
106
+ else
107
+ raise Informative, "配置文件不存在: #{config_file}"
108
+ end
109
+ end
110
+
111
+
112
+ # 处理 CocoaPods
113
+ def handle_cocoapods
114
+ return unless File.exist?(File.join(@project_path, "Podfile"))
115
+
116
+ Dir.chdir(@project_path)
117
+ Pindo::Command::Ios::Podupdate::run([])
118
+
119
+ begin
120
+ # 清理现有 Pods
121
+ FileUtils.rm_rf(File.join(@project_path, "Podfile.lock")) if File.exist?(File.join(@project_path, "Podfile.lock"))
122
+ FileUtils.rm_rf(File.join(@project_path, "Pods")) if File.exist?(File.join(@project_path, "Pods"))
123
+
124
+ puts "正在执行 pod deintegrate..."
125
+ system 'pod deintegrate'
126
+
127
+ puts "正在执行 pod install..."
128
+ system 'pod install'
129
+ rescue => error
130
+ puts(error.to_s)
131
+ raise Informative, "pod install 失败!!先 pod install 完成后再编译!"
132
+ end
133
+
134
+ # 检查 pod install 是否成功
135
+ pod_lock_file = File.join(@project_path, "Podfile.lock")
136
+ unless File.exist?(pod_lock_file)
137
+ raise Informative, "pod install 失败!!先 pod install 完成后再编译!"
138
+ end
139
+ end
140
+
141
+ # 配置证书
142
+ def configure_certificate
143
+ detect_macos_platform
144
+
145
+ # 使用新的证书安装方法
146
+ # config.json 已经通过 pull_config 方法拉取到 @project_path 目录
147
+ require 'pindo/module/cert/xcode_cert_helper'
148
+ Pindo::XcodeCertHelper.install_and_config_certs(
149
+ build_type: 'adhoc',
150
+ platform_type: @macos_flag ? 'macos' : 'ios',
151
+ project_dir: @project_path
152
+ )
153
+ end
154
+
155
+ # 检测是否为 macOS 平台
156
+ def detect_macos_platform
157
+ project_fullname = Dir.glob(File.join(@project_path, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
158
+ return if project_fullname.nil?
159
+
160
+ require 'xcodeproj'
161
+ project_obj = Xcodeproj::Project.open(project_fullname)
162
+ project_build_platform = project_obj.root_object.build_configuration_list.get_setting("SDKROOT")["Release"]
163
+
164
+ if !project_build_platform.nil? && project_build_platform.eql?("macosx")
165
+ @macos_flag = true
166
+ end
167
+ end
168
+
169
+ # 更新 URL Schemes(基于最终 Bundle ID)
170
+ def update_url_schemes_final
171
+ workflow_packname = @workflow_info[:package_name]
172
+ Pindo::XcodeBuildConfig.update_url_schemes_with_bundleid(
173
+ project_dir: @project_path,
174
+ package_name: workflow_packname
175
+ )
176
+ end
177
+
178
+ # 编译 iOS 工程
179
+ def build_ios_project
180
+ Dir.chdir(@project_path)
181
+
182
+ # 使用 XcodeBuildHelper 进行构建
183
+ ipa_file = Pindo::XcodeBuildHelper.build_project(
184
+ project_dir: @project_path,
185
+ icloud_id: nil
186
+ )
187
+
188
+ if ipa_file.nil?
189
+ raise Informative, "构建失败:未生成 IPA 文件"
190
+ end
191
+
192
+ puts "构建成功:#{ipa_file}"
193
+ ipa_file
194
+ end
195
+ end
196
+ end
197
+ end