pindo 5.12.2 → 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 (115) 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/android.rb +0 -1
  5. data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
  6. data/lib/pindo/command/appstore/autobuild.rb +203 -0
  7. data/lib/pindo/command/appstore/autoresign.rb +35 -17
  8. data/lib/pindo/command/appstore/bundleid.rb +120 -0
  9. data/lib/pindo/command/appstore/cert.rb +212 -0
  10. data/lib/pindo/command/appstore/configproj.rb +81 -0
  11. data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
  12. data/lib/pindo/command/appstore/iap.rb +788 -24
  13. data/lib/pindo/command/appstore/initconfig.rb +105 -0
  14. data/lib/pindo/command/appstore/itcapp.rb +95 -13
  15. data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
  16. data/lib/pindo/command/appstore/pem.rb +136 -0
  17. data/lib/pindo/command/appstore/pullconfig.rb +99 -0
  18. data/lib/pindo/command/appstore/quswark.rb +87 -0
  19. data/lib/pindo/command/appstore/quswauth.rb +67 -0
  20. data/lib/pindo/command/appstore/tag.rb +77 -0
  21. data/lib/pindo/command/appstore.rb +13 -1
  22. data/lib/pindo/command/env/quarkenv.rb +11 -13
  23. data/lib/pindo/command/env/swarkenv.rb +11 -16
  24. data/lib/pindo/command/ios/autobuild.rb +64 -43
  25. data/lib/pindo/command/ios/autoresign.rb +34 -19
  26. data/lib/pindo/command/ios/build.rb +10 -7
  27. data/lib/pindo/command/ios/cert.rb +27 -20
  28. data/lib/pindo/command/jps/upload.rb +3 -3
  29. data/lib/pindo/command/unity/autobuild.rb +2 -2
  30. data/lib/pindo/command/utils/clearcert.rb +2 -17
  31. data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
  32. data/lib/pindo/command/utils/renewcert.rb +62 -38
  33. data/lib/pindo/command/utils/renewproj.rb +0 -3
  34. data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
  35. data/lib/pindo/command/utils.rb +2 -0
  36. data/lib/pindo/command/web/autobuild.rb +2 -2
  37. data/lib/pindo/command.rb +30 -3
  38. data/lib/pindo/config/build_info_manager.rb +176 -0
  39. data/lib/pindo/config/ios_config_parser.rb +404 -0
  40. data/lib/pindo/module/android/android_build_helper.rb +110 -0
  41. data/lib/pindo/module/android/android_config_helper.rb +9 -5
  42. data/lib/pindo/module/android/gradle_helper.rb +88 -0
  43. data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
  44. data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
  45. data/lib/pindo/module/build/build_helper.rb +12 -0
  46. data/lib/pindo/module/build/swark_helper.rb +116 -77
  47. data/lib/pindo/module/cert/cert_helper.rb +74 -0
  48. data/lib/pindo/module/cert/pem_helper.rb +72 -0
  49. data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
  50. data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
  51. data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
  52. data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
  53. data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
  54. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
  55. data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
  56. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
  57. data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
  58. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
  59. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
  60. data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
  61. data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
  62. data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
  63. data/lib/pindo/module/task/model/build_task.rb +15 -12
  64. data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
  65. data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
  66. data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
  67. data/lib/pindo/module/task/pindo_task.rb +19 -10
  68. data/lib/pindo/module/unity/unity_helper.rb +2 -1
  69. data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
  70. data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
  71. data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
  72. data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
  73. data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
  74. data/lib/pindo/options/core/global_options_state.rb +268 -0
  75. data/lib/pindo/options/core/option_configuration.rb +206 -0
  76. data/lib/pindo/options/core/option_initializer.rb +51 -0
  77. data/lib/pindo/options/core/option_item.rb +144 -0
  78. data/lib/pindo/options/core/option_value_parser.rb +54 -0
  79. data/lib/pindo/options/groups/build_options.rb +60 -0
  80. data/lib/pindo/options/groups/jps_options.rb +70 -0
  81. data/lib/pindo/options/groups/option_group.rb +73 -0
  82. data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
  83. data/lib/pindo/options/options.rb +14 -0
  84. data/lib/pindo/version.rb +1 -1
  85. metadata +49 -41
  86. data/lib/pindo/command/android/build.rb +0 -186
  87. data/lib/pindo/command/appstore/import.rb +0 -259
  88. data/lib/pindo/command/deploy/build.rb +0 -250
  89. data/lib/pindo/command/deploy/bundleid.rb +0 -259
  90. data/lib/pindo/command/deploy/cert.rb +0 -202
  91. data/lib/pindo/command/deploy/check.rb +0 -93
  92. data/lib/pindo/command/deploy/configproj.rb +0 -120
  93. data/lib/pindo/command/deploy/confusecode.rb +0 -262
  94. data/lib/pindo/command/deploy/confuseproj.rb +0 -122
  95. data/lib/pindo/command/deploy/iap.rb +0 -826
  96. data/lib/pindo/command/deploy/initconfig.rb +0 -138
  97. data/lib/pindo/command/deploy/itcapp.rb +0 -146
  98. data/lib/pindo/command/deploy/pem.rb +0 -55
  99. data/lib/pindo/command/deploy/pullconfig.rb +0 -56
  100. data/lib/pindo/command/deploy/pushconfig.rb +0 -93
  101. data/lib/pindo/command/deploy/quswark.rb +0 -156
  102. data/lib/pindo/command/deploy/quswauth.rb +0 -76
  103. data/lib/pindo/command/deploy/reportbug.rb +0 -145
  104. data/lib/pindo/command/deploy/resign.rb +0 -300
  105. data/lib/pindo/command/deploy/tag.rb +0 -108
  106. data/lib/pindo/command/deploy/uploadipa.rb +0 -73
  107. data/lib/pindo/command/deploy.rb +0 -42
  108. data/lib/pindo/command/dev/autobuild.rb +0 -117
  109. data/lib/pindo/command/dev/build.rb +0 -94
  110. data/lib/pindo/command/dev/debug.rb +0 -112
  111. data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
  112. data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
  113. data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
  114. data/lib/pindo/options/appconfigoptions.rb +0 -24
  115. data/lib/pindo/options/deployoptions.rb +0 -372
@@ -9,7 +9,7 @@ require 'pindo/module/task/task_manager'
9
9
  require 'pindo/module/task/model/git_tag_task'
10
10
  require 'pindo/module/task/model/unity_export_task'
11
11
  require 'pindo/module/task/model/build_task'
12
- require 'pindo/module/task/model/upload_task'
12
+ require 'pindo/module/task/model/jps_upload_task'
13
13
 
14
14
  module Pindo
15
15
  class Command
@@ -197,7 +197,7 @@ module Pindo
197
197
 
198
198
  # 4. 上传任务(如果需要)
199
199
  if @args_upload_flag
200
- upload_task = Pindo::TaskSystem::UploadTask.new(
200
+ upload_task = Pindo::TaskSystem::JPSUploadTask.new(
201
201
  'apk',
202
202
  File.join(android_project_path, 'build'),
203
203
  nil,
@@ -1,7 +1,6 @@
1
1
 
2
2
  require 'pindo/command/android/autobuild'
3
3
  require 'pindo/command/android/autoresign'
4
- require 'pindo/command/android/build'
5
4
  require 'pindo/command/android/keystore'
6
5
 
7
6
 
@@ -3,347 +3,294 @@ require 'xcodeproj'
3
3
  require 'find'
4
4
  require 'fileutils'
5
5
  require 'pindo/base/executable'
6
+ require 'pindo/module/build/build_helper'
7
+ require 'pindo/module/build/version_helper'
8
+ require 'pindo/module/xcode/xcode_build_config'
6
9
  require 'pindo/module/xcode/xcode_build_helper'
7
- require 'pindo/module/xcode/xcodeappconfig'
10
+ require 'pindo/config/ios_config_parser'
11
+ require 'pindo/config/build_info_manager'
12
+ require 'pindo/base/pindocontext'
13
+ require 'pindo/module/task/task_manager'
14
+ require 'pindo/module/task/model/unity_export_task'
15
+ require 'pindo/module/task/model/build_task'
16
+ require 'pindo/module/task/model/jps_upload_task'
17
+ require 'pindo/options/options'
18
+ require 'pindo/options/helpers/bundleid_selector'
8
19
 
9
20
  module Pindo
10
- class Command
11
- class Appstore < Command
12
- class Adhocbuild < Appstore
21
+ class Command
22
+ class Appstore < Command
23
+ class Adhocbuild < Appstore
13
24
 
14
- include Command::DeployOptions
15
-
16
- include XcodeAppConfig
17
- include Appselect
18
-
25
+ # 命令的简要说明 - 打包 AdHoc 包并发布到 JPS
26
+ self.summary = '编译 AdHoc IPA(支持Xcode/Unity工程),自动修改工程,支持上传JPS'
19
27
 
20
- self.summary = '测试时设置Xcode工程编译参数并自动编译及上传'
28
+ # 启用缓存机制
29
+ def self.use_cache?
30
+ true # 此命令启用缓存
31
+ end
32
+
33
+ # 命令的详细说明,包含用法示例
34
+ self.description = <<-DESC
35
+ 编译 AdHoc IPA,自动修改工程配置并支持上传到JPS测试平台。
21
36
 
22
- self.description = <<-DESC
23
- 测试时设置Xcode工程编译参数并自动编译及上传。
37
+ 支持功能:
24
38
 
25
- 支持功能:
39
+ * 自动修改工程配置(Bundle ID、Display Name、URL Schemes)
26
40
 
27
- * 设置Xcode工程编译参数
41
+ * 编译生成 AdHoc IPA 文件
28
42
 
29
- * 自动编译生成IPA
43
+ * 支持上传到JPS测试平台
30
44
 
31
- * 上传到测试平台
45
+ * 支持发送测试通知
32
46
 
33
- * 发送测试通知
34
-
35
- 使用示例:
36
-
37
- $ pindo appstore adhocbuild # 设置参数并编译
38
-
39
- $ pindo appstore adhocbuild --upload # 编译并上传
40
-
41
- $ pindo appstore adhocbuild --send # 编译、上传并发送通知
42
-
43
- $ pindo appstore adhocbuild --increase # 自动增加版本号
44
- DESC
45
-
46
- self.arguments = [
47
- CLAide::Argument.new('path/to/config.json', false),
48
- ]
49
-
50
- def self.options
51
- [
52
- ['--proj', '指定哪个项目(忽略大小写空格等等字符): --proj=\"prancksoundv4\"'],
53
- ['--upload', '编译完成后是否上传ipa到JPS: 用法:pindo appstore output --upload'],
54
- ['--send', '上传到之后是否发送测试信息,用法:pindo appstore output --send'],
55
- ['--increase', '自动增加编译的app版本号,用法:pindo appstore output --increase'],
56
-
57
- ].concat(super)
58
- end
59
-
60
- def initialize(argv)
61
-
62
- @args_proj_name = argv.option('proj')
63
- @args_upload_flag = argv.flag?('upload', false)
64
- @args_send_flag = argv.flag?('send', false)
65
- @args_increase_flag = argv.flag?('increase', false)
47
+ * 支持CI/CD自动化构建
66
48
 
49
+ * 支持自动增加版本号
67
50
 
68
- if @args_send_flag
69
- @args_upload_flag = true
70
- end
51
+ 使用示例:
71
52
 
72
- super
73
- end
53
+ $ pindo appstore adhocbuild # 编译 AdHoc 包
74
54
 
55
+ $ pindo appstore adhocbuild --upload # 编译并上传到JPS
75
56
 
76
- def run
57
+ $ pindo appstore adhocbuild --send # 编译、上传并发送群组通知
77
58
 
78
- build_type_array = @config_json["project_info"]["xcode_build_type"].split("_") || []
79
- @args_nocreate_flag = false
80
- @args_quswark_flag = false
81
- @args_normal_flag = false
59
+ $ pindo appstore adhocbuild --increase # 自动增加版本号
82
60
 
83
- if build_type_array.include?("nocreate")
84
- @args_nocreate_flag = true
85
- end
86
- if build_type_array.include?("normal")
87
- @args_normal_flag = true
88
- end
89
- if build_type_array.include?("quark") || build_type_array.include?("swark")
90
- @args_quswark_flag = true
91
- end
61
+ $ pindo appstore adhocbuild --proj="My App" # 指定项目名称
92
62
 
93
- if @args_increase_flag
94
- auto_increase_buildnumber(app_config_file:File.join(Dir.pwd, "config.json"))
95
- app_config_repo_dir = File.join(pindo_single_config.pindo_dir, @deploy_identifier)
96
- auto_increase_buildnumber(app_config_file:File.join(app_config_repo_dir, "config.json"))
97
- git_addpush_repo(path:app_config_repo_dir, message:"increate build number", commit_file_params:["config.json"])
98
- end
63
+ $ pindo appstore adhocbuild --bundleid=com.example.app # 指定 Bundle ID
64
+ DESC
99
65
 
100
- app_info_obj = nil
101
- workflow_info = nil
102
- if @args_upload_flag || @args_send_flag
103
- proj_name = @args_proj_name
104
- # 传入 package_type 获取 workflow_info
105
- app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
106
- working_directory: Dir.pwd,
107
- proj_name: proj_name,
108
- package_type: 'ipa'
109
- )
110
- end
111
-
112
-
66
+ # 命令的参数列表
67
+ self.arguments = [
68
+ # 暂无参数
69
+ ]
113
70
 
114
- output_fun()
71
+ # 定义此命令使用的参数项(类方法,避免重复定义)
72
+ def self.option_items
73
+ @option_items ||= begin
74
+ items = Pindo::Options::OptionGroup.merge(
75
+ Pindo::Options::BuildOptions.select(:bundleid),
76
+ Pindo::Options::JPSOptions.select(:proj, :upload, :send)
77
+ )
115
78
 
116
- pindo_new_project_dir = Dir.pwd
117
- build_path = File.join(pindo_new_project_dir, "build", "*.ipa")
118
- ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
79
+ # 添加 increase 参数
80
+ items << Pindo::Options::OptionItem.new(
81
+ key: :increase,
82
+ description: '自动增加编译的app版本号',
83
+ type: Pindo::Options::OptionItem::Boolean,
84
+ optional: true,
85
+ example: 'pindo appstore adhocbuild --increase'
86
+ )
119
87
 
120
- if !ipa_file_upload.nil? && !app_info_obj.nil?
121
- result_data = PgyerHelper.share_instace.start_upload(
122
- app_info_obj: app_info_obj,
123
- ipa_file_upload: ipa_file_upload,
124
- description: nil,
125
- workflow_info: workflow_info
126
- )
127
- if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
128
- PgyerHelper.share_instace.print_app_version_info(
129
- app_info_obj: app_info_obj,
130
- app_version_info_obj: result_data["data"]
131
- )
132
- if @args_send_flag
133
- # 始终发送给自己
134
- PgyerHelper.share_instace.send_apptest_msg(
135
- app_info_obj: app_info_obj,
136
- app_version_info_obj: result_data["data"],
137
- receiveType: "self"
138
- )
139
-
140
- # 额外发送到测试群
141
- PgyerHelper.share_instace.send_apptest_msg(
142
- app_info_obj: app_info_obj,
143
- app_version_info_obj: result_data["data"],
144
- chatEnv: "DevTest",
145
- receiveType: "chat"
146
- )
147
- end
148
- end
149
- end
150
-
151
- system "open #{pindo_new_project_dir}"
152
-
153
- end
154
-
155
-
156
- def output_fun
157
-
158
- currentDir = Dir.pwd
159
- pindo_dir = File::expand_path(pindo_single_config.pindo_dir)
160
- app_config_dir = File.join(pindo_dir, @deploy_identifier)
161
- app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
162
-
163
-
164
- args_temp = []
165
- args_temp << @args_appconfig
166
-
167
- args = get_build_type_args()
168
- args_temp = args_temp | args
169
-
170
- args = get_release_build_args()
171
- args_temp = args_temp | args
172
-
173
-
174
- pindo_new_project_dir = Dir.pwd
175
- unless @args_nocreate_flag
176
- Pindo::Command::Utils::Renewproj::run(args_temp)
177
- pindo_new_project_dir = ENV["pindo_new_project_dir"]
178
- system "open #{pindo_new_project_dir}"
179
- puts "New Project: #{pindo_new_project_dir}"
180
- end
181
-
182
-
183
- Dir.chdir(pindo_new_project_dir)
184
- begin
185
- FileUtils.rm_rf(File.join(pindo_new_project_dir, "Podfile.lock"))
186
- FileUtils.rm_rf(File.join(pindo_new_project_dir, "Pods"))
187
- rescue StandardError => e
188
- end
189
-
190
-
191
- Dir.chdir(pindo_new_project_dir)
192
- modify_release_config(project_dir:pindo_new_project_dir, config_json:@config_json)
193
- Pindo::Command::Deploy::Configproj::run(args_temp)
194
- modify_release_firebase(project_dir:pindo_new_project_dir, config_json:@config_json)
195
-
196
-
197
- if File.exist?(File.join(pindo_new_project_dir, "Podfile"))
198
- Pindo::Command::Ios::Podupdate::run([])
199
-
200
- begin
201
- remove_test_pod_modue(project_dir:pindo_new_project_dir)
202
- Pod::Command::Install::run([])
203
- rescue => error
204
- puts(error.to_s)
205
- raise Informative, "pod install失败!!先pod install 完成后成编译 !"
206
- end
207
-
208
-
209
- pod_lock_file = File.join(pindo_new_project_dir, "Podfile.lock")
210
- if !File.exist?(pod_lock_file)
211
- raise Informative, "pod install失败!!先pod install 完成后成编译 !"
212
- end
213
-
214
- Pindo::XcodeBuildHelper.backup_podfile_lock(project_dir:pindo_new_project_dir, app_config_dir:app_config_dir, appversion:@config_json["app_info"]["app_build_version"])
215
-
216
- end
217
-
218
- if @args_quswark_flag
219
- Dir.chdir(pindo_new_project_dir)
220
- quark_temp = ["./config.json", "--adhoc"]
221
- Pindo::Command::Deploy::Quswark::run(quark_temp)
222
- end
223
-
224
- unless @args_normal_flag
225
- Dir.chdir(pindo_new_project_dir)
226
- Pindo::Command::Dev::Confuseproj::run(args_temp)
227
- end
228
-
229
- Dir.chdir(pindo_new_project_dir)
230
- Pindo::Command::Deploy::Cert::run(args_temp)
231
-
232
- Dir.chdir(pindo_new_project_dir)
233
- Pindo::Command::Deploy::Build::run(args_temp)
234
-
235
-
236
- build_path = File.join(pindo_new_project_dir, "build", "*.ipa")
237
- ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
238
-
239
- unless @args_normal_flag
240
- if !ipa_file.nil? && File.exist?(ipa_file_upload)
241
- if @args_quswark_flag
242
- Dir.chdir(pindo_new_project_dir)
243
- quark_temp = ["./config.json", "--adhoc"]
244
- Pindo::Command::Deploy::Quswark::run(quark_temp)
245
- end
88
+ items
89
+ end
90
+ end
91
+
92
+ # 命令的选项列表
93
+ def self.options
94
+ # 转换为 CLAide 格式
95
+ option_items.map { |item| item.to_claide_option }.concat(super)
96
+ end
246
97
 
247
- args_temp << "--push"
248
- Dir.chdir(pindo_new_project_dir)
249
- Pindo::Command::Deploy::Confusecode::run(args_temp)
98
+ def initialize(argv)
99
+ # 一行代码完成参数初始化(自动推导命令名、自动启用缓存)
100
+ @options = initialize_options(argv)
250
101
 
251
- Dir.chdir(pindo_new_project_dir)
252
- Pindo::Command::Deploy::Build::run(args_temp)
102
+ # 保存参数到实例变量
103
+ @args_bundle_id = @options[:bundleid]
104
+ @args_send_flag = @options[:send]
105
+ # send 依赖 upload:如果指定了 send,自动启用 upload
106
+ @args_upload_flag = @options[:send] || @options[:upload]
107
+ @args_proj_name = @options[:proj]
108
+ @args_increase_flag = @options[:increase]
109
+
110
+ super
111
+ @additional_args = argv.remainder!
112
+ end
113
+
114
+ def validate!
115
+ super
116
+ end
253
117
 
254
- end
255
- end
118
+ def run
119
+ pindo_project_dir = Dir.pwd
120
+
121
+ begin
122
+ # 加载 JPS 配置(如果存在)
123
+ context = Pindo::PindoContext.instance
124
+ context.load_and_apply_jps_config(pindo_project_dir)
125
+
126
+ # 注意:参数缓存已在 initialize 中通过 GlobalOptionsState 处理
127
+ # 不再使用 PindoContext 的缓存机制
128
+
129
+ # 处理配置文件
130
+ prepare_config(pindo_project_dir)
131
+
132
+ # 准备配置
133
+ config = prepare_ios_config(pindo_project_dir)
134
+
135
+ # 创建并执行任务
136
+ tasks = make_build_task(config)
137
+
138
+ # 添加到任务管理器并执行
139
+ task_manager = Pindo::TaskSystem::TaskManager.instance
140
+ task_manager.clear_all
141
+ tasks.each { |task| task_manager.add_task(task) }
142
+ task_manager.start
143
+
144
+ system "open #{pindo_project_dir}"
145
+ ensure
146
+ # 清除命令状态(如果启用了缓存,这里会自动保存)
147
+ Pindo::Options::GlobalOptionsState.instance.clear
148
+ end
149
+ end
256
150
 
257
- end
258
-
259
- def get_release_build_args
260
- args_temp = []
261
- unless @apple_id.eql?(pindo_single_config.demo_apple_id)
262
- @args_apple_id = pindo_single_config.demo_apple_id
263
- args_temp << "--u=#{@args_apple_id}"
264
- end
265
-
266
- unless @apple_id.eql?(pindo_single_config.demo_apple_id) && @apple_id.eql?(@deploy_acount_id)
267
- if @args_bundle_id.nil? || @args_bundle_id.empty?
268
- if @config_json && @config_json['project_info'] && @config_json['project_info']['app_type']
269
- @output_repo_name = get_deploy_repo_with_modul_name(module_name:@config_json['project_info']['app_type'])
270
- if @output_repo_name.nil? || @output_repo_name == ""
271
- raise Informative, "config.json app_type is error!!!"
272
- end
273
- @output_config_dir = clong_buildconfig_repo(repo_name: @output_repo_name)
274
- @args_bundle_id = get_setting_bundleid_withdir(repo_dir:@output_config_dir)
275
- end
276
- args_temp << "--a=#{@args_bundle_id}"
277
- else
278
- args_temp << "--a=#{@args_bundle_id}"
279
- end
280
- end
281
- return args_temp
282
- end
283
-
284
- def modify_release_firebase(project_dir:nil, config_json:nil)
285
-
286
- if config_json && config_json['project_info'] && config_json['project_info']['app_type']
287
- @output_repo_name = get_deploy_repo_with_modul_name(module_name:config_json['project_info']['app_type'])
288
- if @output_repo_name.nil? || @output_repo_name == ""
289
- raise Informative, "config.json app_type is error!!!"
290
- end
291
- @output_config_dir = clong_buildconfig_repo(repo_name: @output_repo_name)
292
- @args_bundle_id = get_setting_bundleid_withdir(repo_dir:@output_config_dir)
293
- end
294
-
295
- pindo_dir = File::expand_path(pindo_single_config.pindo_dir)
296
- google_info_config_dir = File.join(pindo_dir, @args_bundle_id)
297
- install_google_plist(project_dir:project_dir, app_config_dir:google_info_config_dir)
298
-
299
- end
300
-
301
- def modify_release_config(project_dir:nil, config_json:nil)
302
-
303
- if config_json && config_json['project_info'] && config_json['project_info']['app_type']
304
- @output_repo_name = get_deploy_repo_with_modul_name(module_name:config_json['project_info']['app_type'])
305
- if @output_repo_name.nil? || @output_repo_name == ""
306
- raise Informative, "config.json app_type is error!!!"
307
- end
308
- @output_config_dir = clong_buildconfig_repo(repo_name: @output_repo_name)
309
- @args_bundle_id = get_setting_bundleid_withdir(repo_dir:@output_config_dir)
310
- end
311
-
312
-
313
- @output_config_json_file=File::join(@output_config_dir, "config.json")
314
- @output_config_json=JSON.parse(File.read(@output_config_json_file))
315
- @config_json["app_info"]["facebook_app_id"] = @output_config_json["app_info"]["facebook_app_id"]
316
- @config_json["app_info"]["facebook_client_token"] = @output_config_json["app_info"]["facebook_client_token"]
317
-
318
- if !@config_json["app_info"]["admob_app_id"].nil? && !@output_config_json["app_info"]["admob_app_id"].nil?
319
- @config_json["app_info"]["admob_app_id"] = @output_config_json["app_info"]["admob_app_id"]
320
- end
321
- if !@config_json["app_info"]["applovin_app_id"].nil? && !@output_config_json["app_info"]["applovin_app_id"].nil?
322
- @config_json["app_info"]["applovin_app_id"] = @output_config_json["app_info"]["applovin_app_id"]
323
- end
324
-
325
- # puts " @config_json[ app_setting] ================12"
326
- # puts @config_json["app_setting"]
327
-
328
- @config_json["app_setting"].each do |k, v|
329
- if k.eql?("kGUKeyAppClientHost") || k.eql?("kGUKeyResBaseUrl") || k.eql?("app_web_host") || k.eql?("app_client_url") || k.eql?("app_client_url") then
330
-
331
- else
332
- if !@output_config_json["app_setting"][k].nil?
333
- @config_json["app_setting"][k] = @output_config_json["app_setting"][k]
334
- end
335
- end
336
- end
337
-
338
- current_config_file = File.join(project_dir, "config.json")
339
- File.open(current_config_file, "w") do |f|
340
- f.write(JSON.pretty_generate(@config_json))
341
- end
342
-
343
- end
151
+ private
344
152
 
153
+ # 准备配置文件
154
+ def prepare_config(project_dir)
155
+ if @args_bundle_id && !@args_bundle_id.empty?
156
+ # 如果指定了 Bundle ID,拉取配置
157
+ puts "\n拉取 Bundle ID 配置: #{@args_bundle_id}"
345
158
 
159
+ build_info_manager = Pindo::BuildInfoManager.share_instance
160
+ success = build_info_manager.pull_appconfig_with_reponame(
161
+ repo_name: @args_bundle_id,
162
+ target_dir: project_dir
163
+ )
164
+
165
+ unless success
166
+ raise Informative, "拉取配置失败: #{@args_bundle_id}"
167
+ end
168
+
169
+ # 加载拉取的配置到 IosConfigParser
170
+ config_file = File.join(project_dir, "config.json")
171
+ if File.exist?(config_file)
172
+ puts "加载配置文件: #{config_file}"
173
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
174
+ else
175
+ raise Informative, "配置文件不存在: #{config_file}"
176
+ end
177
+ else
178
+ # 如果没有指定 Bundle ID,使用当前目录的 config.json
179
+ config_file = File.join(project_dir, "config.json")
180
+
181
+ if File.exist?(config_file)
182
+ puts "\n使用当前目录配置文件: #{config_file}"
183
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
184
+ else
185
+ raise Informative, "当前目录未找到 config.json 文件,请使用 --bundleid 参数指定 Bundle ID"
186
+ end
187
+ end
188
+ end
189
+
190
+ # 创建构建任务
191
+ def make_build_task(config)
192
+ # 检测项目类型
193
+ build_helper = Pindo::BuildHelper.share_instance
194
+ project_type = build_helper.project_type(config[:project_path])
195
+
196
+ case project_type
197
+ when :android
198
+ raise Informative, "Android 工程, 请使用 pindo android build"
199
+ when :ios, :unity
200
+ # 判断是否是 Unity 工程
201
+ is_unity = (project_type == :unity)
202
+
203
+ tasks = []
204
+
205
+ # 1. Unity 导出任务(仅 Unity 工程)
206
+ if is_unity
207
+ # 确定 iOS 导出路径
208
+ base_ios_path = File.join(config[:project_path], "GoodPlatform", "BaseiOS")
209
+ ios_path = File.join(config[:project_path], "GoodPlatform", "iOS")
210
+ ios_export_path = File.exist?(base_ios_path) ? base_ios_path : ios_path
211
+
212
+ unity_context = {}
213
+ unity_context[:project_name] = @args_proj_name if @args_proj_name
214
+
215
+ unity_task = Pindo::TaskSystem::UnityExportTask.new(
216
+ 'ios',
217
+ project_path: config[:project_path],
218
+ export_path: ios_export_path,
219
+ deploy_mode: 'adhoc', # AdHoc 使用 adhoc 模式
220
+ context: unity_context
221
+ )
222
+ tasks << unity_task
223
+ end
224
+
225
+ # 2. 构建任务(AdHoc 模式)
226
+ build_mode = :adhoc
227
+
228
+ # 确定 iOS 项目路径
229
+ if is_unity
230
+ ios_project_path = ios_export_path
231
+ else
232
+ ios_project_path = config[:project_path]
233
+ end
234
+
235
+ build_options = {
236
+ project_path: ios_project_path,
237
+ proj_name: @args_proj_name,
238
+ upload: @args_upload_flag,
239
+ send: @args_send_flag,
240
+ app_info_obj: config[:app_info_obj],
241
+ workflow_info: config[:workflow_info]
242
+ }
243
+ build_options[:bundle_id] = @args_bundle_id if @args_bundle_id
244
+ build_options[:unity_root_path] = config[:project_path] if is_unity
245
+
246
+ build_task = Pindo::TaskSystem::BuildTask.create_task(
247
+ platform: :ios,
248
+ mode: build_mode,
249
+ options: build_options
250
+ )
251
+ build_task.dependencies << tasks.last.id if tasks.any?
252
+ tasks << build_task
253
+
254
+ # 3. 上传任务(如果需要)
255
+ if @args_upload_flag
256
+ upload_task = Pindo::TaskSystem::JPSUploadTask.new(
257
+ 'ipa',
258
+ File.join(ios_project_path, 'build'),
259
+ nil,
260
+ app_info_obj: config[:app_info_obj],
261
+ workflow_info: config[:workflow_info],
262
+ project_name: @args_proj_name,
263
+ context: {
264
+ send_to_chat: @args_send_flag
265
+ },
266
+ dependencies: [build_task.id]
267
+ )
268
+ tasks << upload_task
346
269
  end
270
+
271
+ tasks
272
+ else
273
+ raise Informative, "当前目录不是工程目录,不能编译"
274
+ end
275
+ end
276
+
277
+ # 准备 iOS 配置
278
+ def prepare_ios_config(pindo_project_dir)
279
+ # 获取 JPS 配置
280
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
281
+ working_directory: pindo_project_dir,
282
+ proj_name: @args_proj_name,
283
+ package_type: 'ipa'
284
+ )
285
+
286
+ {
287
+ project_path: pindo_project_dir,
288
+ app_info_obj: app_info_obj,
289
+ workflow_info: workflow_info
290
+ }
347
291
  end
292
+
293
+ end
348
294
  end
295
+ end
349
296
  end